Tkinter按钮为消息添加行

时间:2015-04-17 04:49:32

标签: python button tkinter

我正在尝试使用tkinter在python中创建一个简单的gui应用程序。有一个消息字段,一个条目和一个按钮。我正在尝试为按钮编写命令,该命令将条目中的文本发送到消息字段,然后清除条目。这是我的代码:

from tkinter import *
from tkinter.ttk import *

class window(Frame):

    def __init__(self, parent):
        messageStr="Hello and welcome to my incredible chat program its so awesome"

        Frame.__init__(self, parent)

        self.parent = parent

        self.parent.title("Hello World")
        self.style = Style()
        self.style.theme_use("default")

        self.pack(fill=BOTH, expand="yes")

        lfone = Frame(self)
        lfone.pack(fill=BOTH, expand="yes")


        myentry = Entry(self).pack(side=LEFT, fill=BOTH, expand="yes", padx=5)

        messager = Message(lfone, text=messageStr, anchor=S+W, justify=LEFT).pack(fill=BOTH, expand="yes", padx=5, pady=5)

        sendbutton = Button(self, text="Send", command=self.sendbuttoncommand).pack(side=RIGHT)

    def sendbuttoncommand(*args):
        messager.text = messager.text + myentry.get()
        myentry.delete(first, last=None)


def main():

    root = Tk()
    root.geometry("300x200+300+300")
    app=window(root)
    root.mainloop()

if __name__ == '__main__':
    main()

我尝试过sendbutton命令的一些变体,包括将其嵌套在def init 中,并将messager和我的条目更改为self.messager / myentry但是没有成功。就目前而言,当我尝试运行它时,我在messager上得到了一个名字错误。如何影响方法范围之外的变量?我希望避免在这种情况下使用全局变量。

2 个答案:

答案 0 :(得分:3)

sendbuttoncommand方法中,messager未定义,因为它仅在__init__中本地定义。这是造成NameError的原因。

如果您想在messager方法中重复使用sendbuttoncommand,只需在self.messager方法中将其定义为__init__,即可将其作为实例的参数。在self.messager中调用sendbuttoncommand

但是,我怀疑你之后会遇到其他错误。

答案 1 :(得分:3)

除了@JulienSpronock anwser之外,你需要知道写这篇文章的时候:

myentry = Entry(self).pack(side=LEFT, fill=BOTH, expand="yes", padx=5)
messager = Message(lfone, text=messageStr, anchor=S+W, justify=LEFT).pack(fill=BOTH, expand="yes", padx=5, pady=5)
sendbutton = Button(self, text="Send", command=self.sendbuttoncommand).pack(side=RIGHT)

myentrymessagersendbutton都是None。不要这样做。它应该是:

myentry = Entry(self)
myentry.pack(side=LEFT, fill=BOTH, expand="yes", padx=5)
messager = Message(lfone, text=messageStr, anchor=S+W, justify=LEFT)
messager.pack(fill=BOTH, expand="yes", padx=5, pady=5)
sendbutton = Button(self, text="Send", command=self.sendbuttoncommand)
sendbutton.pack(side=RIGHT)

原因是pack()(或grid())返回None