【问题标题】:tkinter: No input possible after messagebox is calledtkinter:调用消息框后无法输入
【发布时间】:2021-01-15 10:40:47
【问题描述】:

我想在我的程序开始时调用一个消息框(带有 messagebox.showwarning)来通知用户一些事情。 当用户单击“确定”时,将打开一个 GUI。用户可以在那里进行输入。

问题:显示警告后无法输入。没有警告窗口,输入工作没有任何问题。

有没有用户可以提供输入的解决方案?

我在这里包含了一个代码 sn-p:

import tkinter as tk
from tkinter import *
from tkinter import messagebox

root = tk.Tk()
root.geometry('420x100')

# Input doesn't work after the messagebox
messagebox.showwarning("Warning", "Some Serious Warning.")

# Label
li = Label(root, text="Input 1")
li.grid(row=0, column=0)
li = Label(root, text="Input 2")
li.grid(row=0, column=2)
li = Label(root, text="Dropdown")
li.grid(row=1, column=0)
li = Label(root, text="Input 3")
li.grid(row=1, column=2)

# Input
url_text = StringVar()
e1 = Entry(root, textvariable=url_text)
e1.grid(row=0, column=1)

# Dropdown Menu
OptionList = [
    "1",
    "2",
    "3"
]
input1 = StringVar()
input1.set(OptionList[0])
e3 = tk.OptionMenu(root, input1, *OptionList)
e3.config(width=12, font=('Helvetica', 9))
e3.grid(row=1, column=1)

input2 = StringVar()
e2 = Entry(root, textvariable=input2)
e2.grid(row=0, column=3)

input3 = StringVar()
e4 = Entry(root, textvariable=input3)
e4.grid(row=1, column=3)

# Button
b1 = Button(root, text="Run", width=12)
b1.grid(row=2, column=1)

b2 = Button(root, text="Help", width=12)
b2.grid(row=2, column=2)

b3 = Button(root, text="Exit", width=12)
b3.grid(row=2, column=3, pady=(10, 10))

root.mainloop()

【问题讨论】:

    标签: python python-3.x tkinter input warnings


    【解决方案1】:

    在显示消息框之前,您需要致电root.wait_visibility()root.update()

    root.wait_visibility()  # or root.update()
    messagebox.showwarning("Warning", "Some Serious Warning.")
    

    或者在显示消息框后使用foucs_force()获取焦点:

    messagebox.showwarning("Warning", "Some Serious Warning.")
    root.focus_force()
    

    【讨论】:

      【解决方案2】:

      早些时候,当您同意消息框时,您的 gui 正在由锁定标签的消息框创建的窗口中构建。使用类方法解决了这个问题,但消息框创建的窗口需要手动关闭。 我建议不要使用消息框,而是创建标签或新窗口作为错误框。

      import tkinter as tk
      from tkinter import *
      from tkinter import messagebox
      
      class app:
          def __init__(self):
              hi=messagebox.showwarning("Warning", "Some Serious Warning.")
          
              self.window=tk.Tk()
              self.window.geometry('420x100')
      
              # Label
              li = Label(self.window, text="Input 1")
              li.grid(row=0, column=0)
              li = Label(self.window, text="Input 2")
              li.grid(row=0, column=2)
              li = Label(self.window, text="Dropdown")
              li.grid(row=1, column=0)
              li = Label(self.window, text="Input 3")
              li.grid(row=1, column=2)
      
              # Input
              url_text = StringVar()
              e1 = Entry(self.window, textvariable=url_text)
              e1.grid(row=0, column=1)
      
              # Dropdown Menu
              OptionList = [
                  "1",
                  "2",
                  "3"
              ]
              input1 = StringVar()
              input1.set(OptionList[0])
              e3 = tk.OptionMenu(self.window, input1, *OptionList)
              e3.config(width=12, font=('Helvetica', 9))
              e3.grid(row=1, column=1)
      
              input2 = StringVar()
              e2 = Entry(self.window, textvariable=input2)
              e2.grid(row=0, column=3)
      
              input3 = StringVar()
              e4 = Entry(self.window, textvariable=input3)
              e4.grid(row=1, column=3)
      
              # Button
              b1 = Button(self.window, text="Run", width=12)
              b1.grid(row=2, column=1)
      
              b2 = Button(self.window, text="Help", width=12)
              b2.grid(row=2, column=2)
      
              b3 = Button(self.window, text="Exit", width=12)
              b3.grid(row=2, column=3, pady=(10, 10))
          
      game=app()
      game.window.mainloop()
      

      【讨论】:

      • 这确实解决了问题。如果在 self.window = tk.Tk() 之后设置消息框,则也不会调用空窗口。所以也应该是一个解决方案
      猜你喜欢
      • 2018-07-03
      • 2022-08-09
      • 2021-08-04
      • 2013-07-03
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多