我正在尝试向窗口添加自定义标题,但遇到问题。我知道我的代码不正确,但是当我运行它时,它会创建 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")
如果您没有创建根窗口,当您尝试创建任何其他小部件时,Tkinter 将为您创建一个根窗口。因此,在您的
__init__
中,由于您在初始化框架时尚未创建根窗口,Tkinter 将为您创建一个。然后,您调用 make_widgets
创建一个 second 根窗口。这就是为什么您会看到两个窗口。
编写良好的 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)
。虽然两者最终都会做同样的事情,但前者是调用该函数的正确方法。
这里既美好又简单。
root = tkinter.Tk()
root.title('My Title')
root
是您创建的窗口,root.title()
设置该窗口的标题。
尝试类似:
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()
现在你应该有一个带有标题的框架,然后你可以添加窗口 如果您愿意,可以使用不同的小部件。
必须强调的一点是: .title()方法必须在.mainloop()之前
示例:
# A simple hello world software
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
并且标题不会显示在顶部框架上。
这是一个例子:
from tkinter import *;
screen = Tk();
screen.geometry("370x420"); //size of screen
更改窗口名称
screen.title('Title Name')
运行它:
screen.mainloop();
我发现这个作品:
window = Tk()
window.title('Window')
也许这有帮助?
简单方法:
root = Tk()
root.title('Hello World')
我自己刚刚完成此操作,您可以这样做:
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 参考内容所示。
对于遇到打开两个窗口问题并遇到此问题的任何人,以下是我偶然发现的解决方案:
这个问题中的代码产生两个窗口的原因是因为
Frame.__init__(self, parent)
之前正在运行
self.root = Tk()
简单的修复方法是在运行
Tk()
之前运行 Frame.__init__()
:
self.root = Tk()
Frame.__init__(self, parent)
为什么会这样,我不太确定。
self.parent 是对实际窗口的引用,因此 self.root.title 应该是 self.parent.title,并且 self.root 不应该存在。
widget.winfo_toplevel().title("My_Title")
更改
Tk
或 Toplevel
实例的标题,该实例是 widget
的子级。
我找到了一个可以帮助您的解决方案:
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