在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不应该存在。