0

我在使用以下代码时遇到问题(我是 Python 相关的大多数事情的初学者),并且不确定如何在这个意义上使用“自我”。我只是想在单击开始按钮时检索在我创建的条目框中给出的任何值(请记住,根据 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))

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

4

2 回答 2

1

self仅在类中才有意义——这是引用类的“当前”实例的传统方式,即您实际使用的实例。在类之外,您只需使用普通参数名称。

我不知道将您的函数作为类的方法是否有意义Button。否则,您应该将您的Button实例显式传递给每个函数。

(还要注意for i in i根本没有意义 - 您不能将迭代器称为与您正在迭代的列表相同的东西。做for x in i,或者,甚至更好,for x in range(4)。)

于 2012-06-26T07:02:46.157 回答
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 形式。' '.join(["hello", "world"])只是一种调用此方法的pythonic方式。

于 2012-06-26T07:09:11.553 回答