0

我可能忽略了一些明显的事情,但是这个问题让我陷入了困境。我想弹出多个文本框并动态填充每个文本框。当我运行以下代码时,我得到一个“AttributeError”,出于某种原因,它希望我在 def 中为“self”提供一些东西。

我的根本错误在哪里?以下是包含在单独文件中的类。

class NoninteractiveTextBox:
def __init__(self, master, location, sizew, sizeh):
    self.text_box = Text(master, width=sizew, height=sizeh, font=("Helvetica", 16))
    self.text_box.tag_configure("center", justify="center")
    self.text_box.place(x=location[0], y=location[1])
    self.text_box.tag_add("center", "1.0", "end")
    self.text_box.config(state="disabled")

def inject_text(self, event_text):
    self.text_box.config(state="normal")
    self.text_box.insert(1.0, event_text)
    self.text_box.tag_add("center", "1.0", "end")
    self.text_box.config(state="disabled")

以下基本上是主要的。

from tkinter import *
from WidgetsTools import NoninteractiveTextBox

root = Tk()
root.title('test text')
root.geometry("1600x900")

location = [100, 500]
ntb = NoninteractiveTextBox
ntb(root, location, 80, 10)
ntb.inject_text(???, "testing text for NTB")


root.mainloop()

ntb.inject_text(???, "testing text for NTB") 是问题所在,我想这是我制作课程本身的一个新手错误。任何提示都会有所帮助。

4

2 回答 2

2

它应该是:

ntb = NoninteractiveTextBox(root, location, 80, 10)
ntb.inject_text("testing text for NTB")
于 2021-06-30T00:02:43.540 回答
1
ntb = NoninteractiveTextBox
ntb(root, location, 80, 10)

容我们说,这是一种非常不寻常的方式来尝试创建一个类的实例:-)

第一行设置ntb为对类的引用,而不是类的实例。

由于ntbNoninteractiveTextBox现在实际上是对该类的相同引用,因此第二行与使用后者代替前者相同(顺便说一句,这就是为什么它没有因为缺少而失败self):

NoninteractiveTextBox(root, location, 80, 10)

换句话说,它创建了一个实例,但立即将其丢弃,因为您没有将它分配给任何东西。

这就是这一行的问题:

ntb.inject_text("testing text for NTB")

因为ntb是类而不是实例,所以它被认为是类方法调用,它不会自动提供self作为第一个参数。这就是为什么它抱怨缺少参数。

您应该改用它,设置ntb为您的类的一个实例,并允许它这样使用:

ntb = NoninteractiveTextBox(root, location, 80, 10)
于 2021-06-30T00:01:48.947 回答