【问题标题】:How to return the value of self in a class?如何在类中返回 self 的值?
【发布时间】:2021-04-22 08:55:56
【问题描述】:

我有一个名为buttongen 的类,它根据建筑物内的房间生成按钮。将对房间进行评估,并将结果存储在数据库中。如何返回按钮上的文本值以存储在变量中?每次我尝试存储房间的结果时,它都会给出错误TypeError: __init__() missing 2 required positional arguments: 'i' and 'row'

编辑:包括搜索建筑物和生成按钮的代码部分

    def search():
        global screen13
        global btn
        screen13 = Tk()
        screen13.geometry("300x250")
        screen13.title("Rooms")
        sitename3_info = sitename.get().strip()
        if sitename3_info:
            cursor = cnn.cursor()
            # combine the two SQL statements into one
            sql = ("SELECT roomname FROM rooms, Sites "
                   "WHERE rooms.siteID_fk2 = Sites.siteID AND siteName = %s")
            cursor.execute(sql, [sitename3_info])
            rooms = cursor.fetchall()
            # remove previous result (assume screen13 contains only result)
            for w in screen13.winfo_children():
                w.destroy()
            if rooms:
                for i, row in enumerate(rooms):
                    buttongen(i, row)
            else:
                Label(screen13, text="No room found").grid()

    class buttongen():
        def __init__(self,i,row):
            # creates a self generated amount of buttons which correspond to the amount of rooms in the table.
            self.i = i
            self.row = row
    
            self.roomname = self.row[0]
            self.btn = Button(screen13, text = self.roomname, command=lambda :[print(self.roomname), action()])
            self.btn.grid(row=i, column=0)
        def showroomname(self):
            print(self.roomname)

如何在roomclicked_info = buttongen() 中存储按钮上的文本

【问题讨论】:

  • 您的 __init__ 需要 2 个元素 irow
  • 您的问题源于您创建实例的位置。你没有向我们展示那部分代码。此外,将完整的错误回溯添加到问题中。
  • 当你调用一个类来创建它的实例时,返回值自动为self。执行此操作时会自动调用类的 __init__(),但是当您调用该类时,您没有传递所需的 irow 参数,这是导致错误的原因。您需要更多地学习课程并更好地了解如何使用它们。

标签: python class tkinter self


【解决方案1】:

正确的代码可能是这样的:

i = 10   # the i you want
row = 10 # the row you want
roomclicked_info = buttongen(i, row)

class buttongen 需要 2 个必需的位置参数。

【讨论】:

  • 我无法指定我想要的 i 和 row,因为它每次都会改变。按钮不是固定的,它们会根据建筑物而变化,这就是我使用 self.iself.row 的原因
  • @Julia 那么你为什么让它们成为__init__签名的一部分
【解决方案2】:

要初始化buttongen()的对象,您需要传递def __init__(self,i,row):中定义的两个必需参数irow

当您使用roomclicked_info = buttongen() 创建对象时,您没有在buttongen() 中指定irow 参数。您可以在此处传递irow 的值,例如roomclicked_info = buttongen(i, row)

【讨论】:

  • 即使roomclicked_info = buttongen(I,row)我仍然收到诸如I和row未定义之类的错误。
  • 是的,这很明显。您必须指定 i & 行是什么。正如我在您的代码 self.roomname = self.row[0] 中看到的那样,该行是一种可迭代变量,例如(列表或元组)
  • 最好在def showroomname(self)下创建一个名为roomclick的列表并使用append(self.roomname)
  • 别想了。在您修复 def __init__(self, i, row) 之前,您将无法访问 def showroomname(self)。您不必在class buttongen(): 下查找问题。你需要关注对象初始化,你需要了解什么是irow。问题在于是什么,您需要在任何地方继续之前完全理解它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 2020-11-23
相关资源
最近更新 更多