如果条目为空则显示 MessageBox

Show MessageBox if Entry empty

有人能告诉我我做错了什么吗?!我正在尝试在 Python 3 中使用 tkinter 创建 GUI。如果用户单击按钮,同时条目为空,我想显示 messageBox。 在我的代码下方我用过。

正确知道我有这个错误

if len(self.entryBox.get()) == 0:
AttributeError: 'NoneType' object has no attribute 'get'

我也尝试使用它 if self.entryBox is None: 但在那种情况下,我在 运行 项目之后立即看到 messageBox 现在是正确的。我真的很困惑。

代码:

    from tkinter import *

    class Application(Frame):
         def __init__(self, master):
            super(Application, self).__init__(master)
            self.grid()
            self.widgets()

         def widgets(self):
            self.entryBox = Entry(self).grid()
            Button(self, text="Submit", command=self.search()).grid()

         def search(self):
             if len(self.entryBox.get()) == 0:
                 tkinter.messagebox.showinfo("Warning!", "Box is empty! Write something")
             else:
                 do_something()

    # main
    root = Tk()
    root.title("Title")
    app = Application(root)
    root.mainloop()
  1. self.entryBox = Entry(self).grid()会将.grid()的结果赋值给self.entryBox。相反,试试这个:

    self.entryBox = Entry(self)
    self.entryBox.grid()
    
  2. 通过执行 Button(self, text="Submit", command=self.search()).grid() 你会遇到类似的问题,因为你 运行 一次 search 方法然后将该方法的结果绑定到 command 参数。相反,这应该有效(注意缺少 ():

    Button(self, text="Submit", command=self.search).grid()
    

原因是调用函数后立即调用按钮,将行替换为

Button(self, text="Submit", command=lambda: self.search()).grid()

这对我来说很好

from tkinter import *
import tkinter as tk

class Application(Frame):
     def __init__(self, master):
        super(Application, self).__init__(master)
        self.grid()
        self.widgets()

     def widgets(self):
        self.entryBox = tk.Entry(self)
        self.entryBox.grid()
        print(self.entryBox.get())
        Button(self, text="Submit", command=lambda: self.search()).grid()
        print(self.entryBox)
     def search(self):
         print(self.entryBox.get())
         if len(self.entryBox.get()) == 0:
             tk.messagebox.showinfo("Warning!", "Box is empty! Write something")
         else:
             do_something()

# main
root = Tk()
root.title("Title")
app = Application(root)
root.mainloop()

我认为有两个问题:

(1) self.entryBox

密码

self.entryBox = Entry(self).grid()

将使 self.entryBox 成为 grid() 的 return 值 ,而不是 Entry 小部件对象。将该行更改为

self.entryBox = Entry(self)
self.entryBox.grid()

(2) 绑定命令到按钮

当您将回调函数绑定到按钮时,您必须传递函数本身。变化

Button(self, text="Submit", command=self.search()).grid()

Button(self, text="Submit", command=self.search).grid()

。此外,如果将 Button 设置为属性,

self.button = Button(self, text="Submit", command=self.search)
self.button.grid()

您可以通过其他方法控制按钮。

下面的例子在我的电脑上运行。

# -----
# from tkinter import *
from Tkinter import *
import tkMessageBox
# -----

class Application(Frame, object):
     def __init__(self, master):
        super(Application, self).__init__(master)
        self.grid()
        self.widgets()

     def widgets(self):
        #self.entryBox = Entry(self).grid()
        self.entryBox = Entry(self)
        self.entryBox.grid()

        self.button = Button(self, text="Submit", command=self.search)
        self.button.grid()

     def search(self):
         if len(self.entryBox.get()) == 0:
             # -----
             # messagebox.showinfo("Warning!", "Box is empty! Write something")
             tkMessageBox.showinfo("Warning!", "Box is empty! Write something")
             # -----
         else:
             # do_something()
             # -----
             # print(self.entryBox.get())
             print self.entryBox.get()
             # -----

# main
root = Tk()
root.title("Title")
app = Application(root)
root.mainloop()

(我现在没有python 3,所以我将一些行修改为python 2样式。)