Python:辅助窗口没有完全销毁

Python:辅助窗口没有完全销毁,python,tkinter,Python,Tkinter,我正在做一个Tkinter项目来理解python和Tkinter。 我被困在这样一种情况下,我从主窗口调用辅助弹出窗口,在弹出窗口被破坏后,它不会返回主屏幕 文件mainsrc.py import tkinter as tk import popup root = tk.Tk() root.overrideredirect(True) width = root.winfo_screenwidth() height = root.winfo_screenheight() root.geometr

我正在做一个Tkinter项目来理解python和Tkinter。 我被困在这样一种情况下,我从主窗口调用辅助弹出窗口,在弹出窗口被破坏后,它不会返回主屏幕

文件mainsrc.py

import tkinter as tk
import popup

root = tk.Tk()
root.overrideredirect(True)
width = root.winfo_screenwidth()
height = root.winfo_screenheight()
root.geometry('%dx%d+%d+%d' % (width*0.8, height*0.8, width*0.1, height*0.1))

def popup():
    showPopup()
    print("popup destroyed")

show_btn = tk.Button(root, command= popup) 
show_btn.pack()

root.mainloop()
文件popup.py

import tkinter as tk

class showPopup():
    def __init__(self):
        self.popup = tk.Toplevel()
        self.popup.title("Details")
        w = 400     # popup window width
        h = 250     # popup window height
        sw = self.popup.winfo_screenwidth()
        sh = self.popup.winfo_screenheight()
        x = (sw - w)/2
        y = (sh - h)/2
        self.popup.geometry('%dx%d+%d+%d' % (w, h, x, y))
        self.show()
        self.popup.mainloop()

    def save(self):        
        self.popup.destroy()

    def show(self):
        save_btn = tk.Button(self.popup, text="Save", command= self.save)
        save_btn.pack()
上面是我的代码,我从主屏幕调用了
showPopup()
类,它使用tkinter中的
Toplevel()
创建了新的弹出窗口。 但即使我破坏了弹出窗口,它也应该返回主窗口并打印“popup Distromed”,但事实并非如此


弹出窗口正在关闭,但未执行打印语句。当我关闭主窗口时,控制台执行print语句,经过一些混乱之后,我找到了解决方案

(这是在您对我之前的注释进行了先前的更改之后,其中包含我后来更改以修复此问题的代码)

主要错误似乎来自您在
popup()
函数中声明类
showPopup()
的对象

我必须做的第一个修复是showPopup来自另一个文件。为了解决这个问题,我编写了
popup.showPopup()
,但是,这是不对的,因为代码认为它是一个函数

要解决上述问题,我必须以另一种方式导入弹出窗口。由于您只使用showPopup类,只需从popup import showPopup执行
。现在,如果你已经把它放下了,因为它不起作用,那么就去掉
popup.showPopup()

现在,只需对该类调用save()。为此,我将showPopup()类分配给一个名为
new
的变量,然后在其下调用
new.save()

我还删除了popup.mainloop(),因为TopLevel()不需要它

完整代码:

mainScr.py:

import tkinter as tk
from popup import showPopup

root = tk.Tk()
root.overrideredirect(True)
width = root.winfo_screenwidth()
height = root.winfo_screenheight()
root.geometry('%dx%d+%d+%d' % (width * 0.8, height * 0.8, width * 0.1, height * 0.1))


def popup():
    new = showPopup()
    new.save()
    print("popup destroyed")


show_btn = tk.Button(root, command=popup)
show_btn.pack()

root.mainloop()

popup.py:

import tkinter as tk


class showPopup():
    def __init__(self):
        self.popup = tk.Toplevel()
        self.popup.title("Details")
        w = 400  # popup window width
        h = 250  # popup window height
        sw = self.popup.winfo_screenwidth()
        sh = self.popup.winfo_screenheight()
        x = (sw - w) / 2
        y = (sh - h) / 2
        self.popup.geometry('%dx%d+%d+%d' % (w, h, x, y))

    def save(self):
        self.popup.destroy()

    def show(self):
        save_btn = tk.Button(self.popup, text="Save", command=self.save)
        save_btn.pack()


在popup.py脚本中,show()函数需要将self作为参数,因为它在showPopup类中。此外,当我“导入popup.py”时,我会收到一个错误,当我“导入popup”时,该错误会消失instead@JamesHuang谢谢你的建议,但是在这里写的时候有一个拼写错误,但是yeah show()已经有了self参数,我已经导入为“导入弹出窗口”。对不起,您不应该多次调用
mainloop()
。删除
self.popup.mainloop()
new.save()
将破坏刚刚创建的顶级。尝试过,但现在弹出窗口按钮不显示。弹出窗口只是一个空白screen@JamesHuang谢谢,这很好,因为我从popup.py中删除了“popup.mainloop()”,但我想在弹出被破坏后执行print语句,我想代码会这样做。正如ac1668所描述的,popup()函数中的代码会销毁新创建的toplevel并打印它所拥有的内容。我看不出这里有什么错误。@MayankJain您可以在
showPopup
类的
函数的
\uu init\uuu()
末尾添加
self.popup.mainloop()
(即替换
self.popup.mainloop())。