0

我是 GUI 和类的新手,我有点困惑,当我在 tkinter for python 中使用一个按钮时,它应该在按下时重复它的命令。但在我的程序中并没有这样做。我的代码有什么问题可以反击吗?我正在尝试制作一个简单的程序来回显输入的任何内容。

-谢谢

from Tkinter import *
from PIL import Image, ImageTk
import tkMessageBox

class appsMain(Frame):

    def __init__(self,parent):
        Frame.__init__(self,parent)
        self.parent=parent

        self.initUI()
    def initUI(self):
        self.parent.title("OrganizedWindows")

        self.send=Text(self,bg="white",height=3,width=35)
        self.send.place(x=17,y=235)

        self.msg=Text(self,width=35,height=12,state="disable")
        self.msg.place(x=17,y=20)

        sendbtn=Button(self,text=" Listen ",command=self.accept)
        sendbtn.place(x=305,y=240)

        self.pack(fill=BOTH, expand=1)

    def accept(self,msg):
        self.msg.configure(state="normal")
        self.msg.insert(INSERT,msg+"\n")
        self.msg.insert(INSERT,"BYE")
        self.msg.configure(state="disable")

root=Tk()
root.geometry("350x300+300+300")
app=appsMain(root)
root.mainloop()
4

2 回答 2

3

您的代码有一些问题。第一个很容易解决:

sendbtn=Button(self,text=" Listen ",command=self.accept)

不起作用,因为当单击按钮时,self.accept调用时没有附加参数(accept需要 2 个参数,[selfmsg],但它只得到 1 个 [ self])。

您可以使用以下方法解决此问题lambda

sendbtn=Button(self,text=" Listen ",command=lambda : self.accept("some message here"))

(这相当于):

def func:
    self.accept("some message here")

sendbtn=Button(self,text=" Listen ",command=func)

但是,我不知道您是否要不断添加不同的消息......或者它们来自哪里,所以在这一点上很难给出一个通用的解决方案。

即使在引发异常后,Tkinter 应用程序也会愉快地继续运行。在开发 Tkinter 应用程序时观察终端是否存在异常是个好主意(在这种情况下,它指出了问题的根源)。

于 2012-06-26T18:21:08.963 回答
0

这是为了更好地回答您的 Lambda 评论问题。Lambda 是一种快速、单行的方法来编写函数。您设置的变量与def myFunction的函数名称相同。然后你说关键字lambda和你放在关键字 lambda 之后的字母/单词只是你的函数的参数。接下来你放一个冒号(就像你对一个普通的函数一样-> def myFunction:)。之后,您编写任何您希望函数返回的内容。因此,如果您想要一个函数对给定数字n进行平方,那么您可以正常编写如下:

def square_num(n):
    return n**2

或者作为一个很酷的 Lambda:

square_num = lambda n: n**2

您也可以拥有任意数量的参数,就像在普通函数中一样,所以对于一个给定的数字,您可以写成 x 次方:

raise_num = lambda n, x: n**x
于 2014-01-05T01:45:01.553 回答