我有以下问题。我用 Tkinter 创建了一个图形用户界面,当我在我的 IDE (Spyder) 中运行它时一切正常,但是当我将文件另存为并想通过执行 .py 来启动它时,everytime a window is created or a dialog opens, a second Tkinter window is poping up .当我将代码保存为 .pyw 时出现同样的问题。 我发布了一个持续存在于同一问题中的简短示例。
import tkinter as tk
from tkinter import messagebox
class test_GUI(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self._initializeWindow()
self._window.protocol("WM_DELETE_WINDOW", self.__on_closing)
self._window.mainloop()
def _initializeWindow(self):
self._window=tk.Tk()
self._window.title("The window I initzialized")
def __on_closing(self):
if(messagebox.askokcancel("Quit", "Quit program?")):
self._window.destroy()
self._window.quit()
app=test_GUI()
最佳答案
您将类定义为
class test_GUI(tk.Frame):
所以你的类继承自tk.Frame
,这意味着你的类基本上是一个具有额外功能的框架。
当你做的时候
super().__init__(master)
您初始化您要继承的类,即 tk.Frame
。此时,没有tk.Tk
对象(和master=None
)。因为如果没有 tk.Tk
的实例,框架(或任何其他 tkinter 小部件)就无法存在,所以 tkinter 默默地为您制作了一个。这是您的第一个窗口。
之后你打电话
self._window = tk.Tk()
自己制作一个tk.Tk
实例。这是您的第二个窗口。除了你不想要两个窗口之外,你永远不应该同时运行一个以上的 tk.Tk
实例(或者更准确地说是关联的 Tcl 解释器),因为这会导致意外行为。
那么如何解决这个问题?
您基本上有两个选择:删除继承或在启动类之前启动 tk.Tk
。
如果没有继承,您的应用可以像这样构造
import tkinter as tk
class test_GUI():
def __init__(self):
self._window=tk.Tk()
self._window.title("The window I initzialized")
self.button = tk.Button(self._window, text='Test button')
self.button.pack()
...
self._window.mainloop()
通过继承你可以这样做
import tkinter as tk
class test_GUI(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.master.title("The window I initzialized")
self.button = tk.Button(self, text='Test button')
self.button.pack()
root = tk.Tk()
app=test_GUI(root)
app.pack(fill='both', expand=True)
root.mainloop()
两种方式都可以。我个人喜欢继承的版本。另请查看 Bryan Oakley 关于构建 tkinter 应用程序的帖子 here .
关于python - tkinter 在打开对话框或创建窗口时打开第二个窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50833518/