微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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_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","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,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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。