2010-03-07 109 views
41

我想向窗口添加一个自定义标题,但我遇到了麻烦。我知道我的代码是不正确的,但是当我运行它时,它会创建2个窗口,一个只带有标题tk,另一个带有“Simple Prog”的更大窗口。我怎样才能让tk窗口的标题为“Simple Prog”,而不是有一个新的附加窗口。我不认为我假设有,因为当我有,在我的完整代码,有一个错误在python中使用Tkinter编辑标题栏

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") 
+0

来到这里,但我实际上是寻找http://stackoverflow.com/questions/30009909/change-title-of-tkinter-application-in-os-x-menu-bar在其他人的情况下 – Andrei 2015-06-07 10:39:17

回答

0

self.parent是实际窗口的引用,所以self.root的TK()的一部分。标题应该是self.parent.title,并且self.root不应该存在。

+0

它似乎没有工作。我想保持self.parent = Tk()? – Dan 2010-03-07 10:24:07

+0

是的,你是。我只是说要将self.root.title改为self.parent.title并删除self.root – 2010-03-14 09:11:41

73

如果您不创建根窗口,当您尝试创建任何其他窗口小部件时,Tkinter会为您创建一个窗口。因此,在您的__init__中,因为您在初始化框架时尚未创建根窗口,Tkinter会为您创建一个。然后,您可以拨打make_widgets,这会创建一个第二个根窗口。这就是为什么你看到两个窗口。

一个写得很好的Tkinter程序应该总是在创建任何其他小部件之前明确地创建一个根窗口。

当您修改代码以显式创建根窗口时,最终会出现一个带预期标题的窗口。

例子:

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()而非ABC.make_widgets(self)。虽然两者都做同样的事情,但前者是调用函数的正确方法。

+0

是的,我刚刚在python ABC()。mainloop()中运行了这段代码,它做了2件事,一个叫Simple Prog的窗口,另一个窗口,但只是标题栏部分用“tk” – Dan 2010-03-08 04:33:04

+2

@Dan:我的猜测是,因为您在创建主窗口之前创建了一个框架,Tkinter正在为您创建顶层窗口(或者可能只是一个无形的框架小部件) 。你有你的代码的方式是错误的。在创建任何其他窗口之前,您需要创建根窗口。 – 2010-03-08 12:05:43

13

尝试类似:

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() 

现在你应该有带标题的框架,那么以后如果你喜欢,你可以添加窗户 不同的部件。

+0

这个解决方案和@Bryan的解决方案都适合我(python 3) – 2017-09-28 09:44:06

1

刚走这样做我自己,你可以这样来做:

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参考资料。

+0

那么这篇文章究竟与我发布的有什么不同呢? – lugte098 2014-04-14 10:45:29

+0

我的答案是几年前,所以我不记得为什么 - 我的答案更接近OP样本,并保留在课堂上,但如果它们重要,它们可能会被建议作为编辑。不知道... – 2014-04-14 12:38:26

1

对于任何遇到两个窗口打开的问题,并且会遇到此问题。这是我如何偶然找到解决方案。

在这个问题上的代码生成两个窗口的原因是因为

Frame.__init__(self, parent) 

被前

self.root = Tk() 

运行的简单的解决方法是运行框架.__ init_之前运行TK()( )

self.root = Tk() 
Frame.__init__(self, parent) 

为什么是这样的话,我不能完全肯定。

3

我不知道如果我是对的,但这是你想要的?

root = tkinter.Tk() 
    root.title('My Title') 

根是你创建的窗口,其余是非常自我解释。

0
widget.winfo_toplevel().title("My_Title") 

改变或者TkToplevel实例的标题,该widget是一个孩子。

+0

另外,查看更多关于[为什么有多个窗口显示](https://stackoverflow.com/questions/48289171/why-is-toplevel-showing-2-windows/48289343#48289343)。 – Nae 2018-01-29 23:08:52