两个 tkinter GUI 变量之间的冲突

如何解决两个 tkinter GUI 变量之间的冲突

我有一个主 GUI 和辅助 GUI,辅助 GUI 可以独立调用,也可以通过按主 GUI 上的按钮调用

场景 1:当我直接打开辅助 GUI 时,一切正常。

场景 2:当我从主 GUI 调用辅助 GUI 时。两个 GUI 的变量之间存在一些冲突。我创建了一个高度简化的示例,它也产生了同样的问题。

问题:从主 GUI 打开辅助 GUI 后,当我们尝试从第二个 GUI 中选择路径时,它根本没有出现在入口小部件中。但是,它在变量中设置值并且可以打印。

我正在寻找一种解决方案来帮助我分别保留这两个文件(我不想在 MainGUI 中合并辅助 GUI)

我知道,这是我犯的一些愚蠢的错误,但任何帮助将不胜感激。

Main_GUI.py

import tkinter as tk
from tkinter import filedialog
import os
#from b import *

class App:
    def __init__(self,master):
        self.master = master
        master.geometry('470x100')
        master.title("Main GUI")

        # Path
        self.labelframe0 = tk.LabelFrame(master,text="Enter path",width=10,height=55,font=("TkDefaultFont",9,"bold"))
        self.labelframe0.pack(fill="both",expand="yes")
        self.folder_path = tk.StringVar()
        self.lbl1 = tk.Entry(self.labelframe0,textvariable=self.folder_path,width=67)
        self.lbl1.place(x=0,y=4)
        self.button2 = tk.Button(self.labelframe0,text="browse",bg="orange",fg="black",command=self.browse_button)
        self.button2.place(x=410,y=0)

        # Button
        self.labelframe1 = tk.LabelFrame(master,text="Button",height=50,"bold"))
        self.labelframe1.pack(fill="both",expand="yes")
        self.btn2 = tk.Button(self.labelframe1,text="Secondary GUI",command=self.SecondaryGUI)
        self.btn2.place(x=0,y=0)


    def SecondaryGUI(self): 
        with open(os.path.join(os.path.dirname(os.path.abspath(__file__)),"b.py"),"r") as source_file:
            code = compile(source_file.read(),os.path.join(os.path.dirname(os.path.abspath(__file__)),"exec")
        exec(code,{})
        #b()

    def browse_button(self):
        self.folder_path.__del__
        filename = filedialog.askdirectory()
        self.folder_path.set(filename)
        print(self.folder_path.get())
        

def main():
    window = tk.Tk()
    root = App(window)
    window.mainloop()

if __name__ == '__main__':
    main()

Secondary.py

import tkinter as tk
from tkinter import filedialog
import os

class a_app:
    def __init__(self,window):
        self.window = window
        self.window.geometry('400x60')
        self.window.title("Secondary GUI")

        # path
        self.labelframe0 = tk.LabelFrame(self.window,text="Path to save",width=53)
        self.lbl1.place(x=0,command=self.browse_button)
        self.button2.place(x=325,y=0)

    def browse_button(self):
        self.folder_path.__del__
        self.filename = filedialog.askdirectory(parent=self.window)
        self.folder_path.set(self.filename)
        print(self.folder_path.get())

inst = tk.Tk()
root = a_app(inst)
inst.mainloop()

曼尼什

解决方法

每次创建 Tk() 的新实例时,都会创建一个新的 Tcl 解释器。每个解释器就像一个独立的沙箱,拥有自己的内存。因此,其他解释器无法访问在一个 Tcl 解释器中创建的小部件和变量。

当您使用 tk.StringVar() 而不传递 master 关键字参数时,tkinter 必须猜测要使用哪个解释器。它总是选择创建的 Tk() 的第一个实例。这就是您遇到问题的原因。

这就是为什么人们通常建议只使用一次 tk.Tk() 并在需要更多窗口时使用 tk.Toplevel()

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

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?