如何访问在其他类中的一个类中定义的小部件,而不会看到重新定义的图形界面
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 小部件中