如何访问在其他类中的一个类中定义的小部件,而不会看到重新定义的图形界面

Posted

技术标签:

【中文标题】如何访问在其他类中的一个类中定义的小部件,而不会看到重新定义的图形界面【英文标题】:How to access widgets defined in one class in other classes without seeing the graphical interface being redefined 【发布时间】:2021-12-04 13:00:57 【问题描述】:

我有一个带有几个框架的图形界面,在第三个中我有一个 TKINTER TEXT 小部件,允许我在处理后显示文本文件,当我从另一个类更新此字段时,它可以工作,但每次我失去其他 2 个框架(其中不存在小部件文本),我该怎么做才能防止这种情况发生?

更改文本的代码:

data ='test of writing'
instance = TroisiemeUI(self)
instance.changeText(data)

主要 GUI 的定义:

class MyWindow(Tk):
@catch_all_and_log
    def __init__(self):
        Tk.__init__(self)
        self.create_menu_bar()
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)
        # Créer les volets et les cadres
        self.vertical_pane = ttk.PanedWindow(self, orient=VERTICAL)
        self.vertical_pane.grid(row=0, column=0, sticky="nEsW")
        self.horizontal_pane = ttk.PanedWindow(self.vertical_pane, orient=HORIZONTAL)
        self.vertical_pane.add(self.horizontal_pane)
        self.form_frame = ttk.Labelframe(self.horizontal_pane, text="Supervision")
        self.form_frame.columnconfigure(1, weight=1)
        self.horizontal_pane.add(self.form_frame, weight=1)
        self.console_frame = ttk.Labelframe(self.horizontal_pane, text="Console")
        self.console_frame.columnconfigure(0, weight=50)
        self.console_frame.rowconfigure(0, weight=50)
        self.horizontal_pane.add(self.console_frame, weight=50)
        self.troisieme_frame = ttk.Labelframe(self.vertical_pane, text="Navigation")
        # visu_frame=ttk.Labelframe(vertical_pane, text="Visualisation")
        self.vertical_pane.add(self.troisieme_frame, weight=1)
        # Initialize all frames
        self.form = FormUi(self.form_frame)
        self.console = ConsoleUi(self.console_frame)
        self.third = TroisiemeUI(self.troisieme_frame)
...
        self.protocol('WM_DELETE_WINDOW', self.quit)
        self.bind('<Control-q>', self.quit)
        signal.signal(signal.SIGINT, self.quit)
        #fin
        self.geometry("1200x400")
...
def default_operation_EM(self):
       ...
            # read the text file and show its content on the Text
            data ='test of writing'
            instance = TroisiemeUI(self)
            instance.changeText(data)

定义方法changeText的类:

class TroisiemeUI:
              
    def __init__(self, parent):
        '''
        Constructeur
        '''
        self.parent = parent 
        self.creat_zone_info()
        self.creat_arborescence()
        self.creat_titre()
                                 
    def creat_zone_info(self):    
        # Texte edition
        self.texto = tk.Text(self.parent, height=14)
        self.texto.grid(column=2, row=0,padx=3, sticky='e')
        
    def changeText(self,nvtexte):
        # test = getattr(self.parent,'texto')
         self.texto.insert('1.0',nvtexte)

【问题讨论】:

你的一些缩进看起来坏了。此外,这似乎是太多的代码。请尝试将其压缩为minimal reproducible example。 我不明白你的问题。而且我无法运行它,所以无法提供帮助。 我不知道你想做什么,但你应该只创建一次实例,然后在这种情况下总是更改值 - 但似乎你总是创建新实例,所以你不访问原始内容.在代码中您创建self.third = TroisiemeUI(...),所以稍后您应该使用self.third.changeText(data)。如果您想在其他类中访问它,则创建第一类的实例并将其作为参数发送给其他类,使用self. 分配给变量,然后使用该变量从第一类更新原始小部件。 哦!谢谢“Furas”!经过一天的无菌工作后,我很高兴您找到了我的解决方案……如此简单! :-) : instance = self.third instance.changeText(data) 【参考方案1】:

我无法运行代码来查看问题,但我认为您有问题,因为您创建了 TroisiemeUI 的新实例,但您应该使用现有的 self.third

       def default_operation_EM(self):
            # read the text file and show its content on the Text

            data = 'test of writing'

            self.third.changeText(data)

【讨论】:

以上是关于如何访问在其他类中的一个类中定义的小部件,而不会看到重新定义的图形界面的主要内容,如果未能解决你的问题,请参考以下文章

我想从同一个 dart.file 中的另一个类中调用基于函数的小部件中的值到 Text 小部件中

Kivy:从另一个类的小部件中检索文本?

如何将小部件连接到在一个类中声明的自定义信号,同时在另一个类中

如何在自定义类中隐藏迭代器和容器实现(无增强)

在Java接口的实现类中如何调用这个接口中定义的变量?

如何从另一个类访问小部件