我遇到以下代码的问题(我是Python相关的大多数事情的初学者),并且我不确定如何在这个意义上使用'self'。我只想在单击开始按钮时检索我创建的条目框中给出的任何值(请记住,根据if语句有不同数量的框)。
然而,我得到的错误是“自我”未定义等等。是否有任何方法可以保留我所创建的循环并获取所有值?还是有更简单的方法来编写它?
def ChBox(self, ch):
column = 0
if ch == "List":
i = [0, 1, 2, 3]
for i in i:
ch_title = Label(ch_frame, text='Value %g'% float(i+1), bg='white', borderwidth=0, width=0)
ch_title.grid(row=0, column=column+i, sticky="nsew", padx=1, pady=1)
self.box = Entry(ch_frame, bg='white', borderwidth=0, width=0)
self.box.grid(row=1, column=column+i, sticky="ew", padx=1, pady=1)
elif ch == "Inter":
i = [0, 1]
ch_title1 = Label(ch_frame, text='Min Value', bg='white', borderwidth=0, width=0)
ch_title1.grid(row=0, column=column, sticky="nsew", padx=1, pady=1)
ch_title2 = Label(ch_frame, text='Max Value', bg='white', borderwidth=0, width=0)
ch_title2.grid(row=0, column=column+1, sticky="nsew", padx=1, pady=1)
for i in i:
self.box = Entry(ch_frame, bg='white', borderwidth=0, width=0)
self.box.grid(row=1, column=column+i, sticky="nsew", padx=1, pady=1)
def StartBut(self):
value = self.box.get()
but1 = Button(frame_but, text='Start', command =StartBut(self))
更新:事实上,我想要做的是返回框值而不必使用类或自己,如果可能的话?我担心在我的代码中引入类和自我等会花费太多时间来重写它。
答案 0 :(得分:1)
self
只在一个类中有意义 - 它是传统的方式来引用类的“当前”实例,即你实际使用的那个。在类之外,您只需使用普通参数名称。
我不知道你的函数是否适合成为Button
类的方法。否则,您应该明确地将Button
实例传递给每个函数。
(另请注意for i in i
完全没有意义 - 你不能调用迭代器与你迭代的列表相同。做for x in i
或者更好,{{1 }}。)
答案 1 :(得分:1)
好的,只是通过阅读评论意识到这里的Button
类来自tkinter。
这稍微改变了问题的性质。
command
构造函数的Button
参数是可调用的,没有参数。
这意味着如果你只是传入一个函数,你实际上不能将任何参数传递给该函数。
因此,如果您希望该函数可以访问but1实例,那么您将需要执行其他操作。
有一件事是将整个事物包装在一个类中,例如:
class MyButton(object):
def __init__(self, frame_but, text):
self.but = Button(frame_but, text, command=self.StartBut)
def StartBut(self):
value = self.but.box.get()
这一切都取决于你想要达到的目标,以及你如何设计东西。
另外,我不确定ChBox功能正在尝试实现什么。
在python中,“self”通常是用于类方法的参数名称。
例如,如果您有以下内容:
class Foo(object):
def echo(self, a):
return a
然后当你写:
f = Foo()
f.echo(2)
对f.echo(2)
的调用,它被翻译成类似Foo.echo(f, 2)
的内容,因此实例f
成为第一个参数,因此绑定到self
,和2是第二个参数,绑定到a
。
实际上,您实际上可以调用Foo.echo(f, 2)
,它将与f.echo(2)
完全相同。
我不确定你的Button
班级在做什么,但假设它的确如此:
class Button(object):
...
def hit(self):
self.command()
你想要实现的是将当前的Button
实例传递给命令,你应该写一下:
class Button(object):
...
def hit(self):
self.command(self)
并在构造实例时:
but1 = Button(frame_but, text='Start', command =StartBut)
您可能还想重命名StartBut的参数,因为self
通常仅用作方法的第一个参数:
def StartBut(button):
value = button.box.get()
了解instance.method(args)
转换为Class.method(instance, args)
将有助于您理解大量的python语义。
例如,在学习将列表加入python中的字符串时,通常会看到' '.join(["hello", "world"])
。
许多新手发现这令人困惑,并抱怨python的语法不一致。
但实际上,这与python的其余部分非常一致 - 它所做的只是调用str.join(' ', ["hello", "world"])
,这看起来更像是在其他语言中找到的熟悉的连接形式。 ' '.join(["hello", "world"])
只是调用此方法的pythonic方式。