gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:40:11 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com