python - tkinter 在打开对话框或创建窗口时打开第二个窗口

标签 python user-interface tkinter

我有以下问题。我用 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/

相关文章:

python - 在 Python 中读写环境变量?

Android System Trace [跟踪标记]

python - 停止 Tkinter 窗口而不关闭它

python - 从Python中的文本中提取多个日期

python - 在 Tkinter 中高效显示 OpenCV IplImage

user-interface - UI相关问题验证

java - 如何使用元素的中心将 BoxLayout 中的元素居中?

python - tkinter 对 child 的点击不会传播给 parent

python - tkinter 和 matplotlib Canvas 显示,但不显示导航工具栏和图形标题

javascript - Bokeh HoverTool 自定义字体和来自 Python 的换行符