我正在尝试向窗口添加自定义标题,但遇到了麻烦。 我知道我的代码不正确,但是当我运行它时,它将创建2个窗口,一个仅带有标题tk,另一个更大的带有" Simple Prog"的窗口。 如何使tk窗口具有标题" Simple Prog",而不是具有新的附加窗口。 我不认为我应该拥有Tk()部分,因为当我在完整代码中拥有Tk()部分时,就会出现错误
1
2
3
4
5
6
7
8
9
10
11
12from tkinter import Tk, Button, Frame, Entry, END
class ABC(Frame):
def __init__(self,parent=None):
Frame.__init__(self,parent)
self.parent = parent
self.pack()
ABC.make_widgets(self)
def make_widgets(self):
self.root = Tk()
self.root.title("Simple Prog")
来到这里,但我实际上正在寻找stackoverflow.com/questions/30009909/以防万一还有其他人
如果您没有创建根窗口,当您尝试创建任何其他窗口小部件时,Tkinter会为您创建一个。因此,在__init__中,由于初始化框架时尚未创建根窗口,因此Tkinter会为您创建一个。然后,调用make_widgets,这将创建第二个根窗口。这就是为什么您看到两个窗口的原因。
编写良好的Tkinter程序应始终在创建任何其他小部件之前显式创建一个根窗口。
当您修改代码以显式创建根窗口时,最终将得到一个带有预期标题的窗口。
例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22from tkinter import Tk, Button, Frame, Entry, END
class ABC(Frame):
def __init__(self,parent=None):
Frame.__init__(self,parent)
self.parent = parent
self.pack()
self.make_widgets()
def make_widgets(self):
# don't assume that self.parent is a root window.
# instead, call `winfo_toplevel to get the root window
self.winfo_toplevel().title("Simple Prog")
# this adds something to the frame, otherwise the default
# size of the window will be very small
label = Entry(self)
label.pack(side="top", fill="x")
root = Tk()
abc = ABC(root)
root.mainloop()
还请注意使用self.make_widgets()而不是ABC.make_widgets(self)。尽管两者最终都做同一件事,但是前者是调用该函数的正确方法。
是的,我只是在python ABC()。mainloop()中运行了这段代码,它完成了2件事,一个名为Simple Prog的窗口和另一个窗口,但只有带有" tk"的标题栏部分
@Dan:我的猜测是,因为您在创建主窗口之前先创建了一个框架,所以Tkinter会为您创建一个顶层窗口(或者可能只是一个无形的框架小部件)。您拥有代码的方式是错误的。在创建任何其他窗口之前,需要先创建根窗口。
我不确定我是否正确,但这是您想要的吗?
1
2root = tkinter.Tk()
root.title('My Title')
根是您创建的窗口,其余的很容易解释。
尝试类似:
1
2
3
4
5
6
7
8
9
10
11
12from tkinter import Tk, Button, Frame, Entry, END
class ABC(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
root = Tk()
app = ABC(master=root)
app.master.title("Simple Prog")
app.mainloop()
root.destroy()
现在您应该有一个带有标题的框架,然后可以为
如果您愿意,可以使用其他小部件。
对于遇到打开两个窗口的问题并遇到此问题的任何人。这是我偶然发现解决方案的方式。
这个问题中的代码产生两个窗口的原因是因为
1Frame.__init__(self, parent)
正在运行之前
1self.root = Tk()
简单的解决方法是在运行Frame .__ init_()之前运行Tk()。
1
2self.root = Tk()
Frame.__init__(self, parent)
为什么不是这种情况,我不
自己完成此操作后,您可以通过以下方式进行操作:
1
2
3
4
5
6
7
8
9
10
11from tkinter import Tk, Button, Frame, Entry, END
class ABC(Frame):
def __init__(self, parent=None):
Frame.__init__(self, parent)
self.parent = parent
self.pack()
ABC.make_widgets(self)
def make_widgets(self):
self.parent.title("Simple Prog")
您将看到标题更改,并且不会看到两个窗口。我已经将parent保留为master,就像python库文档中的Tkinter参考资料一样。
那么,这篇文章与我发布的内容有何不同?
我的答案是几年前的,所以我不记得为什么-我的答案更接近OP样本,并保留在课堂上,但是如果有问题,可以建议将其作为对您的修改。不知道...
python GUI示例
这是一个例子:
1
2
3from tkinter import *;
screen = Tk();
screen.geometry("370x420"); //size of screen
Change the name of window
1screen.title('Title Name')
运行:
1screen.mainloop();
我不太确定这会增加其他答案之一吗
1widget.winfo_toplevel().title("My_Title")
更改widget是其子元素的Tk或Toplevel实例的标题。
另外,请参阅有关为何显示多个窗口的更多信息。
self.parent是对实际窗口的引用,因此self.root.title应该是self.parent.title,而self.root不应该存在。
它似乎不起作用。我是否应该保留self.parent = Tk()?
是的,你是。我只说过将self.root.title更改为self.parent.title并删除self.root