通过单独的定义检索条目值

时间:2012-06-26 06:57:41

标签: python if-statement self

我遇到以下代码的问题(我是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))

更新:事实上,我想要做的是返回框值而不必使用类或自己,如果可能的话?我担心在我的代码中引入类和自我等会花费太多时间来重写它。

2 个答案:

答案 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方式。