【问题标题】:Tkinter button add line to messageTkinter 按钮在消息中添加行
【发布时间】:2015-04-17 04:49:31
【问题描述】:

我正在尝试使用 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()

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

【问题讨论】:

    标签: python button tkinter


    【解决方案1】:

    在您的 sendbuttoncommand 方法中,messager 未定义,因为它仅在 __init__ 中本地定义。这就是导致 NameError 的原因。

    如果您想在sendbuttoncommand 方法中重用messager,只需通过在__init__ 方法中调用sendbuttoncommand 中的self.messager 将其定义为self.messager,使其成为实例的参数.

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

    【讨论】:

    • 我将 lfone、myentry、messager 和 sendbutton 的声明行移到了返回错误的 init 方法上方,self 未定义
    【解决方案2】:

    除了@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

    【讨论】:

    • 谢谢,这很有帮助,但小部件仍然只能从 init 访问
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    相关资源
    最近更新 更多