在python中使用Tkinter编辑标题栏

时间:2010-03-07 06:50:21

标签: python tkinter titlebar

我正在尝试向窗口添加自定义标题,但我遇到了麻烦。我知道我的代码不对,但是当我运行它时,它会创建2个窗口,一个只有标题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 个答案:

答案 0 :(得分:82)

如果您不创建根窗口,当您尝试创建任何其他窗口小部件时,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)。虽然两者最终都做同样的事情,但前者是调用函数的正确方法。

答案 1 :(得分:21)

我不确定我是对的,但这是你想要的吗?

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

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

答案 2 :(得分: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()

现在你应该有一个带标题的框架,然后你可以添加窗口 如果你愿意,可以使用不同的小部件。

答案 3 :(得分:2)

Python GUI示例


这里是一个例子:

from tkinter import *;
screen = Tk();
screen.geometry("370x420"); //size of screen
  

更改窗口名称

  screen.title('Title Name')

运行它:

screen.mainloop();

答案 4 :(得分:2)

我发现这可行:

window = Tk()
window.title('Window')

也许有帮助吗?

答案 5 :(得分: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参考内容中。

答案 6 :(得分:1)

任何遇到打开两个窗口的问题的人都会遇到这个问题。以下是我偶然发现解决方案的方法。

这个问题中的代码产生两个窗口的原因是因为

Frame.__init__(self, parent)

正在

之前运行
self.root = Tk()

简单的解决方法是在运行Frame .__ init _()

之前运行Tk()
self.root = Tk()
Frame.__init__(self, parent)

为什么会这样,我不完全确定。

答案 7 :(得分:1)

简便方法:

root = Tk()
root.title('Hello World')

答案 8 :(得分:0)

self.parent是对实际窗口的引用,因此self.root.title应该是self.parent.title,self.root不应该存在。

答案 9 :(得分:0)

Tk

更改Toplevel所属的widget或{{1}}个实例的标题。

答案 10 :(得分:0)

必须强调的一点是: .title()函数必须在.mainloop()之前

示例:


from tkinter import *

# Instantiating/Creating the object
main_menu = Tk()

# Set title
main_menu.title("Hello World")

# Infinite loop
main_menu.mainloop()

否则,可能会发生此错误:

File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/tkinter/__init__.py", line 2217, in wm_title
    return self.tk.call('wm', 'title', self._w, string)
_tkinter.TclError: can't invoke "wm" command: application has been destroyed

标题不会显示在顶部框架上。

答案 11 :(得分:0)

我找到了一个可以帮助您的解决方案:

from tkinter import Tk, Button, Frame, Entry, END

class ABC(Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.pack()
        self.master.title("Simple Prog")
        self.make_widgets()

    def make_widgets(self):
        pass

root = Tk()
app = ABC(master=root)
app.mainloop()

发现于:docs.python.org