在Python中使用Tkinter编辑标题栏

84 投票
12 回答
290112 浏览
提问于 2025-04-15 20:06

我想给一个窗口加个自定义标题,但遇到了一些问题。我知道我的代码不对,但运行的时候却出现了两个窗口,一个只有“tk”这个标题,另一个更大的窗口上写着“Simple Prog”。我想知道怎么才能让这个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")

12 个回答

16

试试下面这个:

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

现在你应该有一个带标题的框架了,接下来如果你想的话,可以在里面添加不同的小窗口来放置各种小部件。

93

如果你不自己创建一个主窗口,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)。虽然这两种方式最终都能实现相同的效果,但前者是调用这个函数的正确方式。

94

这里很简单明了。

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

root 是你创建的窗口,而 root.title() 用来设置这个窗口的标题。

撰写回答