【问题标题】:Python & TkInter - How to get value from user in Entry Field then print it on terminalPython & TkInter - 如何在输入字段中从用户那里获取价值,然后在终端上打印
【发布时间】:2016-05-13 21:12:04
【问题描述】:

我正在学习 Python 和 Tkinter 并遵循教程。我正在编写一个程序来完成我在 Powershell 等脚本语言中习惯做的事情,获取用户值,然后用它做一些事情,首先。

我找不到任何看起来像我的示例代码。所以我请求你的帮助。

基本上,这个程序创建了一个带有退出按钮、用户输入值的条目小部件和一个确定按钮的框架。然后,他按下 OK 按钮,该值应该会打印在 python 终端中。

我收到一个错误,但我不明白为什么。我正在学习一个教程,所以我按照他们展示的方式进行操作,通过定义一个类来创建框架,将按钮和文本框放在其中。

下面设置了从条目小部件获取用户输入文本的功能,我将在其中放置其他功能,假设我想为按钮添加功能以进行打印。如果之前设置了要打印的值,我设法使打印工作,但我无法从条目小部件中获取值。

from tkinter import *

class Window:
def __init__(self, master):
    self.master = master
    master.title("Get a value and print it")
    self.info = Label(master, text="Please write something then click ENTER")
    self.info.pack()

    self.ebox= Entry()
    self.ebox.pack()

    self.viewnumber = Button(master, text="OK", activebackground="red", command=get_int)
    self.viewnumber.pack()

    self.quit = Button(master, text="Quit", activebackground="blue", command=quit)
    self.quit.pack()

def get_int():
    intnum = ebox.get
    print(intnum)

def quit():
    root.quit()

root = Tk()
root.geometry("400x400")
my_gui = Window(root)
root.mainloop()

我收到此错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python35-32\lib\tkint
er\__init__.py", line 1549, in __call__
    return self.func(*args)
  File "C:\Users\USERNAME\Desktop\pyth222184.py", line 20, in get_int
    intnum = ebox.get
NameError: name 'ebox' is not defined

感谢您的帮助。

【问题讨论】:

  • 所以,它告诉你ebox 不存在。当我查看您的代码时,我必须同意:没有ebox。有一个self.ebox,但self.eboxebox 不同。调试时的一个好的经验法则是假设错误是真实的。

标签: python-3.x tkinter


【解决方案1】:

实际上问题是无法从函数中访问ebox。您需要使用self.ebox,以便它实际引用实例变量ebox。 要了解更多信息,请访问here

另外,您使用的是self.ebox.get 而不是self.ebox.get()self.ebox.get 本身将返回 self.entry.get 的原始函数对象。要实际调用函数并获取内容,请使用self.ebox.get()

但为了使其工作,必须定义self。为此,请在每个方法中添加 self 作为第一个参数。当你调用instance.method() 时,Python 会自动将instance 作为self 传入。本质上,self 允许您访问当前实例。

【讨论】:

  • 感谢您的帮助和回答。正如您所建议的那样,我进行了此更改:def get_int(): intnum = self.ebox.get() print(intnum) 然后我收到此错误:NameError: name 'self' is not defined 我很确定 self 已在上面定义...如何 self 未定义?
  • @Smor 您需要将 self 作为参数 get_int,就像您为 __init__ 所做的那样。当您调用object.method() 时,实际上有一个method 的参数称为self,Python 会自动将object 作为值传入。
  • @XamuelSchulman get_int 不是一种方法,否则按钮的初始化将具有command = self.get_int,错误将是TypeError: get_int() takes 0 positional arguments but 1 was given,因此OP需要使用my_gui而不是self或者让get_int 成为一种更有意义的方法。
  • 如果我正确理解了这个问题,那么这些函数都应该在类中(忽略缩进问题)。我错了吗?因为如果它们在类中,那么它们就是类的方法。
  • @Smor 我们需要 OP 对此进行澄清。
【解决方案2】:

没错。 Class 中的 get_int 是一个方法,不能像函数一样调用它。你必须像这样的方法调用它

elf.viewnumber = Button(master, text="OK",bg="red",command=lambda:my_gui.get_int() )
self.viewnumber.pack()

这是一个可行的代码示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多