【问题标题】:Getting data from Entry从 Entry 获取数据
【发布时间】:2014-01-07 05:37:56
【问题描述】:

我有一段代码是这样的:

def topLevel():
    bugsendwindows = Toplevel(background="grey")
    bugsendwindows.title("report bug")
    buglabel1 = Label(bugsendwindows, text='title', background="white")
    buglabel1.place(x=10, y=20)
    bugtitleentry = Entry(bugsendwindows)
    bugtitleentry.place(x=50, y=20)
    bugtitleentry.focus_set()
    buglabel2 = Label(bugsendwindows, text="email", background="white")
    buglabel2.place(x=10, y=60)
    bugemailentry = Entry(bugsendwindows)
    bugemailentry.place(x=60, y=60)
    bugemailentry.focus_set()
    buglabel3 = Label(bugsendwindows, text="data", background="white")
    buglabel3.place(x=10, y=100)
    bugdataentry = Entry(bugsendwindows)
    bugdataentry.place(x=60, y=100, height=60)
    bugdataentry.focus_set()
    def Enter():
        global bugtitleentry
        global bugemail
        global bugdata
        bugtitle = bugtitleentry
        bugemail = bugemailentry
        bugdata = bugdataentry
        localtime = time.asctime(time.localtime(time.time()))
        bugwrite = open("bugreport", "w")
        bugwrite.write("title:")
        bugwrite.write(bugtitle, "\n")
        bugwrite.write("writer email:")
        bugwrite.write(bugemail, "\n")
        bugwrite.write("data:")
        bugwrite.write(bugdata, "\n")
        bugwrite.close()

    bugsend = Button(bugsendwindows, text="send",
        command=Enter)
    bugsend.place(x=10, y=150)

但是,每次我点击发送时,它都会显示如下内容:

bugtitle = bugtitleentry
NameError: global name 'bugtitleentry' is not defined

如何修复它,以便 Enter 可以将数据从顶层写入文件?

【问题讨论】:

  • 您的缩进似乎有问题。 Enter 是嵌套在 topLevel 内还是处于同一级别?
  • Enter 是嵌套的。 BUt,如果Enter是嵌套的,能否从topLevel Entries获取数据?
  • 我修改了代码的缩进,希望能更正它。如果我弄错了,请随时修复它。

标签: python tkinter


【解决方案1】:

由于Enter 嵌套在topLevel 中,它会从闭包中获取这些名称,并且不需要global 语句。

# ... <snip>
def Enter():
    bugtitle = bugtitleentry
    bugemail = bugemailentry
# </snip> ...

不过,作为旁注,我不确定数据写入是否会按您的预期工作。您可能需要在Entry 对象上使用.get() 方法。例如:

bugwrite.write(bugtitle.get() + "\n")  # and file.write only takes 1 argument!

【讨论】:

  • FWIW,python3.x 有 nonlocal 关键字来指示变量来自闭包,但不是全局变量。但是,由于您实际上并没有做任何事情来更改绑定到名称的值,因此您也不需要这样做。
  • 我收到一个错误:TypeError:期望一个字符缓冲区对象。上线:bugwrite.write(bugtitle)
  • @user3167683 -- 正如我所解释的,您需要使用.get() 方法:bugwrite.write(bugtitle.get())
  • 谢谢!!它正在工作。我永远不会忘记你。谢谢。
猜你喜欢
  • 2018-06-18
  • 2023-01-30
  • 1970-01-01
  • 2021-08-29
  • 2020-11-28
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多