如何处理按钮点击事件

15 投票
3 回答
144188 浏览
提问于 2025-04-16 22:31

我正在学习Python,基础概念已经掌握,并且写了一些命令行程序。现在我在学习如何用Tkinter创建图形用户界面(GUI)。

我做了一个简单的界面,可以从一个Entry控件中获取用户信息,然后当用户点击提交时,它应该弹出一个对话框。

这个对话框应该询问用户的名字姓氏

问题是我不知道如何处理用户点击提交时的事件。

这是我的代码:

from Tkinter import *

class GUI(Frame):

    def __init__(self,master=None):
        Frame.__init__(self, master)
        self.grid()

        self.fnameLabel = Label(master, text="First Name")
        self.fnameLabel.grid()

        self.fnameEntry = Entry(master)
        self.fnameEntry.grid()

        self.lnameLabel = Label(master, text="Last Name")
        self.lnameLabel.grid()

        self.lnameEntry = Entry(master)
        self.lnameEntry.grid()

        self.submitButton = Button(self.buttonClick, text="Submit")
        self.submitButton.grid()


    def buttonClick(self, event):
        """ handle button click event and output text from entry area"""
        pass


if __name__ == "__main__":
    guiFrame = GUI()
    guiFrame.mainloop()

3 个回答

4

我找到了一本很不错的参考资料,叫做 Thinking in Tkinter,然后我对它做了一些修改。我的目的是让它更符合你的需求。

from tkinter import *

class GUI(Frame):

    def __init__(self,master=None):
        Frame.__init__(self, master)
        self.grid()

        self.fnameLabel = Label(master, text="First Name")
        self.fnameLabel.grid()

        self.fnameEntry = StringVar()
        self.fnameEntry = Entry(textvariable=self.fnameEntry)
        self.fnameEntry.grid()

        self.lnameLabel = Label(master, text="Last Name")
        self.lnameLabel.grid()

        self.lnameEntry = StringVar()
        self.lnameEntry = Entry(textvariable=self.lnameEntry)
        self.lnameEntry.grid()

        def buttonClick():
            print("You pressed Submit!")
            print(self.fnameEntry.get() + " " + self.lnameEntry.get() +",
                  you clicked the button!")

        self.submitButton = Button(master, text="Submit", command=buttonClick)
        self.submitButton.grid()

if __name__ == "__main__":
    guiFrame = GUI()    
    guiFrame.mainloop()
4

你需要指定一个处理器,或者说一个函数,当你点击按钮时会被调用。你可以通过把这个函数的名字(注意,不是调用这个函数)赋值给按钮的command属性来实现。

比如:

self.submitButton = Button(self.buttonClick, text="Submit", command=buttonClick)

注意在把buttonClick作为self.submitButtoncommand属性时,没有加()

另外,你在处理器/函数buttonClick()中不需要第二个参数event

10

你已经有了事件函数。只需要把你的代码改成:

   """Create Submit Button"""
    self.submitButton = Button(master, command=self.buttonClick, text="Submit")
    self.submitButton.grid()

def buttonClick(self):
    """ handle button click event and output text from entry area"""
    print('hello')    # do here whatever you want

这和@Freak的回答是一样的,唯一不同的是buttonClick()方法现在放在了类的__init__方法外面。这样做的好处是,你可以通过程序来调用这个动作。这是面向对象编程(OOP)中编写图形用户界面(GUI)的常见方式。

撰写回答