2010-03-07 23 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