【问题标题】:tkinter Button callback function not being calledtkinter 按钮回调函数未被调用
【发布时间】:2020-08-22 19:44:36
【问题描述】:

我想用python中的tkinter模块制作一个简单的家庭账户程序。我想将okclick 函数绑定到button1。我认为我编写了适当的引用其他代码的代码,但是当我执行此代码时,会出现一条消息,指出函数 okclick 未定义。

有谁知道它有什么问题吗?

from tkinter import *
from tkinter import ttk
import colors as c
from tkcalendar import DateEntry

b=Tk()

class memo(Frame):

    def __init__(self,master):
        Frame.__init__(self,master)
        self.master=master
        self.master.title('Memo')
        self.pack(fill=BOTH, expand=True)

        frame1=Frame(self,width=500,height=50)
        frame1.pack(expand=False)
        label1=Label(frame1,text='Amount',width=10)
        label1.pack(side=LEFT, padx=10,pady=10)
        entry1=Entry(frame1,width=20)
        entry1.pack(padx=10,fill=X,expand=True)

        frame2=Frame(self,width=500,height=50)
        frame2.pack(expand=False)
        label2=Label(frame2,text='Cartegory',width=10)
        label2.pack(side=LEFT, padx=10,pady=10)
        listbox1=Listbox(frame2,width=20)
        listbox1.insert(END,"식료품비","잡화비","건강관리비","외식비")
        listbox1.pack(side=LEFT, padx=10,pady=10)

        frame3=Frame(self,width=500,height=50)
        frame3.pack(expand=False)
        label3=Label(frame3,text='Date',width=10)
        label3.pack(side=LEFT, padx=10,pady=10)
        dateentry = DateEntry(frame3)
        dateentry.pack(padx=10,pady=10)

        frame4=Frame(self,width=500,height=500)
        frame4.pack(expand=False)
        button1=Button(frame4,text='csv Export',command=self.okClick)
        button1.pack(side=LEFT,padx=10,pady=10)

    def okClick(self):
        name = self.entry1.get()
        print(name)

a=memo(b)
a.mainloop()

【问题讨论】:

  • 请使用完整的错误回溯更新您的问题。
  • 在创建Button时使用__init__()方法中的command=self.okClick指定回调函数。
  • 错误回溯如下 ;) 谢谢!发生异常:未定义 NameError 名称 'okClick' 文件“D:\Codes\2048\Memo.py”,第 45 行,在 init button1=Button(frame4,text='csv Export' ,command=okClick) 文件“D:\Codes\2048\Memo.py”,第 50 行,在 a=memo(b)
  • 谢谢。现在用这些详细信息更新问题。
  • 您可以先复制粘贴添加代码,然后选择刚刚粘贴的内容并点击问题的编辑框{}按钮(或按Ctrl-k)。

标签: python tkinter tkcalendar


【解决方案1】:

您的代码有一些问题:

  1. onClick 需要将“self”参数传递给它,您需要将“command=onClick”更新为“command=self.onClick”

  2. 您的 entry1 变量应该设置为一个实例变量,方法是在它前面加上“self”,以便可以从 onClick 方法访问它。 python OOP 中的变量作用域略有不同。

from tkinter import *
from tkinter import messagebox
from tkinter import ttk
from tkcalendar import DateEntry

class Memo(Frame):
    def __init__(self,master):
        Frame.__init__(self,master)
        self.master=master
        self.master.title('Memo')
        self.pack(fill=BOTH, expand=True)

        frame1=Frame(self,width=500,height=50)
        frame1.pack(expand=False)
        label1=Label(frame1,text='Amount',width=10)
        label1.pack(side=LEFT, padx=10,pady=10)
        self.entry1=Entry(frame1,width=20)
        self.entry1.pack(padx=10,fill=X,expand=True)

        frame2=Frame(self,width=500,height=50)
        frame2.pack(expand=False)
        label2=Label(frame2,text='Cartegory',width=10)
        label2.pack(side=LEFT, padx=10,pady=10)
        listbox1=Listbox(frame2,width=20)
        listbox1.insert(END,"식료품비","잡화비","건강관리비","외식비")
        listbox1.pack(side=LEFT, padx=10,pady=10)

        frame3=Frame(self,width=500,height=50)
        frame3.pack(expand=False)
        label3=Label(frame3,text='Date',width=10)
        label3.pack(side=LEFT, padx=10,pady=10)
        dateentry = DateEntry(frame3)
        dateentry.pack(padx=10,pady=10)

        frame4=Frame(self,width=500,height=500)
        frame4.pack(expand=False)
        button1=Button(frame4,text='csv Export',command=self.okClick)
        button1.pack(side=LEFT,padx=10,pady=10)

    def okClick(self):
        name = self.entry1.get()
        messagebox.showinfo("이름", name)

if __name__ == "__main__":
    a=Memo(Tk())
    a.mainloop()

【讨论】:

  • 非常感谢您的帮助 :) 作为初学者,何时使用 self 并不容易辨别。与否。
猜你喜欢
  • 2021-08-27
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 2014-01-10
  • 2013-04-13
  • 2020-10-31
相关资源
最近更新 更多