为什么我的按钮不会在python上使用tkinter GUI重复命令

时间:2012-06-26 17:08:00

标签: python user-interface tkinter

我是GUI和类的新手,我只是有点困惑,当我在tkinter中使用一个用于python的按钮时,它假设在按下时重复它的命令。但是在我的程序中它并没有这样做。我的代码有什么问题可以解决它吗?我正在尝试创建一个简单的程序来回显输入的内容。

-Thanks

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()

2 个答案:

答案 0 :(得分: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应用程序时,最好在终端上查看异常(在这种情况下,它指出了问题的根源)。

答案 1 :(得分: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