在Python中使用Tkinter编辑标题栏
我试图给窗口添加一个自定义标题,但是我遇到了麻烦。 我知道我的代码是不正确的,但是当我运行它,它创build2个窗口,而只有标题tk和另一个更大的窗口与“简单程序”。 我怎样才能让tk窗口的标题是“Simple Prog”,而不是有一个新的附加窗口。 我不认为我想有Tk()的一部分,因为当我有我的完整的代码中,有一个错误
from 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")
如果你不创build一个根窗口,当你尝试创build任何其他的窗口小部件时,tkinter会为你创build一个。 因此,在你的__init__
,因为你在初始化框架时还没有创build一个根窗口,tkinter会为你创build一个。 然后,你调用make_widgets
来创build第二个根窗口。 这就是为什么你看到两个窗口。
一个写得好的tkinter程序应该总是在创build任何其他小部件之前明确地创build一个根窗口。
当你修改你的代码来明确地创build根窗口时,你将会得到一个预期标题的窗口。
例:
from 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()
而不是ABS.make_widgets(self)
。 虽然两者都做同样的事情,前者是调用函数的正确方法。
尝试像这样:
from 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()
现在你应该有一个标题的框架,然后,如果你喜欢,你可以添加不同窗口小部件的窗口。
刚刚完成这个,你可以这样做:
from 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参考的东西。
对于遇到有两个窗口打开的问题的人来说,这个问题会碰到这个问题。 这就是我偶然发现的一个解决scheme。
这个问题的代码产生两个窗口的原因是因为
Frame.__init__(self, parent)
正在运行之前
self.root = Tk()
简单的解决方法是在运行Frame之前运行Tk().__ init_()
self.root = Tk() Frame.__init__(self, parent)
为什么是这样,我不完全确定。
我不知道如果我是对的,但这是你想要的?
root = tkinter.Tk() root.title('My Title')
根是你创build的窗口,其余的是非常明显的。
self.parent是对实际窗口的引用,所以self.root.title应该是self.parent.title,并且self.root不应该存在。