【问题标题】:How can I insert text in a text widget from another class in tkinter?如何在 tkinter 中的另一个类的文本小部件中插入文本?
【发布时间】:2019-09-10 15:21:11
【问题描述】:

我正在尝试通过实例化从另一个类访问 tkinter 文本小部件,但在从外部类调用时它不会被修改,但在类内部调用该方法时工作正常。

我也尝试过@staticmethod,尽管这似乎也不起作用。不过,我更喜欢使用该类的实例化对象。

所以这里是主要的:

if __name__ == "__main__":
    mainapp = tk.Tk()
    mainapp.title("Automatic Proofreader")
    mainapp.configure(background = "gray")
    mainapp.resizable(width = False, height = False)
    Core(mainapp).grid(column = 0, row = 0, sticky = 'news')
    TextDisplay(mainapp).grid(column = 5, row = 0, sticky = 'news')
    mainapp.mainloop()

这是我需要访问的类和方法:

class TextDisplay(tk.Frame):

    def setText(self, text):
        self.displayout.config(state = "normal")
        self.displayout.delete(1.0, tk.END)
        #This inserts nothing when called from outside class
        self.displayout.insert(tk.INSERT, text)
        #But it inserts the correct text when called from this same class
        self.displayout.config(state = "disabled")

    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        verticalscroll = tk.Scrollbar(self)

        self.displayout = tk.Text(self, font = ('comic sans', 20, 'bold'), height = 20, width = 40, bg = "gray", wrap = tk.WORD, yscrollcommand = verticalscroll.set, state= "disabled")
        self.displayout.grid(columnspan = 4)

        verticalscroll.grid(column = 5, sticky = 'ns')
        verticalscroll.config(command = self.displayout.yview)

我首先在另一个类中实例化这个,比如self.displayclass = TextDisplay(mainapp)

并像这样调用方法self.displayclass.setText(self.text)

我在调试中注意到,text 变量 inside 的值在从类外部调用时完美传递(例如,self.text 正确传递为 text)。但是插入不起作用。

编辑:“不工作”我的意思是,它根本不插入任何东西。抱歉没有说清楚。

【问题讨论】:

  • re: “我首先在另一个类中实例化它,例如 self.displayclass= TextDisplay(mainapp)” - 这不是你问题中的代码所做的。另外,请定义“不起作用” 的含义——它是否插入了错误的文本?它是否将文本插入到错误的小部件中?它会抛出错误吗?如果它抛出错误,错误是什么?
  • 所以您正在创建TextDisplay第二个 实例,设置that 的文本,并以某种方式期望它出现在原始版本中实例?这可能适用于巫毒娃娃,但不适用于计算机程序。
  • @jasonharper:我认为巫毒娃娃的评论不适合这个网站。有点太自大了。
  • @BryanOakley 对不起,我认为“它没有被修改”会很清楚,但我的意思是它没有插入任何东西,尽管现在我明白正如 jasonharper 所说,我没有修改actual 类,但第二个实例。那么如何修改实际类的值呢?
  • @Chase:就像我的回答所示,要修改实际类的值,您需要对实际类的引用。

标签: python python-3.x oop tkinter


【解决方案1】:

简而言之,要在对象上调用函数,您必须具有对该对象实例的引用。这是面向对象编程的一个基本方面。

您不一定必须使用全局变量。您可以,或者您可以将其作为属性存储在某个其他对象上。

这是一个有效的最小示例:

if __name__ == "__main__":
    mainapp = tk.Tk()
    displayclass = TextDisplay(mainapp)
    displayclass.grid(column = 5, row = 0, sticky = 'news')

    displayclass.setText("hello, world")
    mainapp.mainloop()

【讨论】:

  • 我想我可以像这样使用displayclass作为全局变量,但是有没有办法直接修改这个类的textwidget的值而不将其声明为全局变量?
  • @Chase:要调用对象的方法,您需要对该对象的引用。这是面向对象编程的一个基本方面。它不必是全局的,它可以是另一个类的属性,作为参数传递等等。
猜你喜欢
  • 2020-06-25
  • 1970-01-01
  • 2017-06-12
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-21
相关资源
最近更新 更多