Tkinter 自定义文本框类不能使用 def

问题描述

我可能忽略了一些明显的问题,但这个问题让我陷入了困境。 我想弹出多个文本框并动态填充每个文本框。当我运行以下代码时,我得到一个“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_con@R_404_6408@ure("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.con@R_404_6408@(state="disabled")

def inject_text(self,event_text):
    self.text_Box.con@R_404_6408@(state="normal")
    self.text_Box.insert(1.0,event_text)
    self.text_Box.tag_add("center","end")
    self.text_Box.con@R_404_6408@(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,80,10)
ntb.inject_text(???,"testing text for NTB")


root.mainloop()

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

解决方法

应该是:

ntb = NoninteractiveTextBox(root,location,80,10)
ntb.inject_text("testing text for NTB")
,
ntb = NoninteractiveTextBox
ntb(root,10)

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

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

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

NoninteractiveTextBox(root,10)

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

这行的问题就在这里:

ntb.inject_text("testing text for NTB")

因为 ntb 是类而不是实例,因此被视为类方法调用,不会自动提供 self 作为第一个参数。这就是它抱怨缺少参数的原因。

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

ntb = NoninteractiveTextBox(root,10)