【问题标题】:Is the objects of tkinter.Tk independent of each other?tkinter.Tk 的对象是否相互独立?
【发布时间】:2018-02-03 10:47:34
【问题描述】:

我编写了一个包含 tkinter 的 python 脚本(名为 script2.py)。为了方便,我在底部写了一个函数。它看起来像:

import tkinter
import pygubu

class GuiApp2:
    def __init__(self,master):
        self.builder=pygubu.Builder()
        self.builder.add_from_file('test.ui')

        self.builder.get_object('Frame_main',master)
        self.list_box_a=self.builder.get_object('Listbox_a')

        self.lba_value_set=tkinter.StringVar()
        self.list_box_a['listvariable']=self.lba_value_set

    def set_value_set(self,the_value_set):
        self.lba_value_set.set(the_value_set)


def run(the_value_set):
    master=tkinter.Tk()
    app=GuiApp1(master)
    app.set_value_set(the_value_set)
    master.mainloop()

def main():
    run(['1','2','3'])

if __name__ == '__main__':
    main()

然后我编写了另一个脚本(名为 script1.py),它调用上面脚本底部的函数。它是:

import tkinter
import pygubu

import script2

class GuiApp1:
    def __init__(self,master):
        self.builder=pygubu.Builder()
        self.builder.add_from_file('mainapp.ui')

        self.builder.get_object('Frame_main',master)
        self.button_show=self.builder.get_object('Button_show')

        self.button_show['command']=self.command_for_button_show

    def command_for_button_show(self):
        script2.run(['1','2','3'])


def main():
    master=tkinter.Tk()
    app=GuiApp1(master)
    master.mainloop()


if __name__ == '__main__':
    main()

当我运行 script2.py 时,一切都很好。但是当我运行导入 script2.py 的 script1.py 时,script2.py 中的列表框是空的。

当然,这两个脚本不是我在项目中使用的文件。我真正使用的文件太长,难以阅读。

为了找出问题所在,我在脚本中插入了几个print 函数来显示脚本中变量的值。最后,除了Listbox,所有的打印结果都很好。

因此我将真正的脚本简化为这些易于阅读的脚本。

我猜可能 script1.py 中的 master(tkinter.Tk()) 会影响 script2.py 中的 master。因为tkinter中GUI管理的逻辑和dotNet中的不同。

有没有人遇到过类似的问题或对此有所了解?

【问题讨论】:

  • 你能提供截图吗?不是每个人都一定有pygubu

标签: python user-interface tkinter listbox tcl


【解决方案1】:

是的,它们是独立的。每次创建Tk 的实例时,都会创建嵌入式 Tcl 解释器的新实例。结果,一个中的小部件对另一个中的小部件一无所知。

一个编写良好的 tkinter 程序不应该创建多个 Tk 的实例。如果您需要额外的窗口,您应该创建Toplevel 的实例。您还应该只调用一次mainloop()

【讨论】:

  • 是的,但我只是想让程序更具可重用性,几个脚本使用 script2.py 中的内容,而 script1 只是其中之一。但是随着程序的发展,可能会有越来越多的脚本使用script2.py。另外,未来script2.py可以在其他项目中使用。
  • @EndlessWay:无论如何,您不应创建多个Tk 实例。
猜你喜欢
  • 2021-10-28
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
相关资源
最近更新 更多