python-3.x - grab_set() 函数在 tkinter 中不起作用

标签 python-3.x tkinter

我之前曾问过同样的问题,这里有一个链接:"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/

相关文章:

python - 为什么 Python Tkinter 单选按钮左对齐?

python - PIL协助Python

python - 为什么在文件名末尾添加点会导致 python 认为该文件存在?

python-3.x - WRN 安装 python-prctl 以便可以保证清理进程

python - 为什么这个 python 字符序列代码给出了意想不到的结果?

python - Tkinter:网格或网格内的包?

python - 如何使用 while 循环 PySimpleGUI 中的键获取日历按钮的值?

python - 在 Python 中显示透明且没有背景或窗口的图像

django - Django 测试用例中的 IntegrityError

python-3.x - 使用相关和随机语料库计算 TF-IDF 单词得分