我之前曾问过同样的问题,这里有一个链接:"Blink" Prompt window if parent window is clicked Tkinter
但它被标记为重复。请帮助我处理我的代码,因为即使经过多次尝试,我也无法在我的代码中实现grab_set()。 有人建议我提出一个新问题,所以就在这里。
我的代码:
import tkinter
from tkinter import *
def mainwindow():
root = Tk()
root.geometry("100x100")
b1 = Button(root, text="Exit", command=prompt)
b1.place(x=50, y=40)
mainloop()
def prompt():
pr = Tk()
pr.geometry("175x100")
pr.grab_set()
lable = Label(pr, text="Do you want to exit?").grid(row=0, column=0, padx=20, pady=15)
b1 = Button(pr, text="Yes", command=exit).grid(row=1, column=0, padx=75)
mainloop()
mainwindow()
即使将 grab_set()
放在 pr
窗口上,我也可以访问 root
窗口。请告诉我将此函数放入我的代码中的正确方法。
最佳答案
您的代码存在一些问题,如之前的答案中指出的那样(对第二个窗口使用 Toplevel
而不是 Tk
,并仅使用 mainloop
一次)以及您应该避免的其他一些习惯,例如导入 tkinter 两次、在局部变量的函数内创建根窗口,或者执行 b1 = Button(..).grid(...)
,当 grid()
方法不返回任何内容时,b1 = None
。除此之外,对于退出应用程序提示,我认为您会更喜欢使用 grab_set_global()
,但正如我之前告诉您的,您必须小心抓取,因为 tkinter 只能抓取具有以下内容的窗口:已映射到屏幕上,因此您需要先使用 wait_visibility()
。这是您的代码的改进:
from tkinter import *
def mainwindow():
root.geometry("100x100")
b1 = Button(root, text="Exit", command=prompt)
b1.place(x=50, y=40)
def prompt():
pr = Toplevel()
pr.geometry("175x100")
pr.wait_visibility()
pr.grab_set_global()
label = Label(pr, text="Do you want to exit?").grid(row=0, column=0, padx=20, pady=15)
Button(pr, text="Yes", command=exit).grid(row=1, column=0, padx=75)
root = Tk()
mainwindow()
root.mainloop()
关于python-3.x - grab_set() 函数在 tkinter 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64797477/