Python 两个tkinter GUI变量之间的冲突

Python 两个tkinter GUI变量之间的冲突,python,tkinter,filedialog,Python,Tkinter,Filedialog,我有一个主GUI和辅助GUI,辅助GUI可以单独调用,也可以通过按下主GUI上的按钮来调用 场景1:当我直接打开辅助GUI时,一切正常 场景2:当我从主GUI调用辅助GUI时。两个GUI的变量之间存在一些冲突。我创建了一个高度简化的示例,它也产生了相同的问题 问题:从主GUI打开辅助GUI后,当我们尝试从第二个GUI选择路径时,它根本不会出现在条目小部件中。但是,它设置变量中的值,并且可以打印 我正在寻找一种解决方案,可以帮助我将两个文件分开。我不想在MainGUI中合并辅助GUI 我知道,这是

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

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

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

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

我正在寻找一种解决方案,可以帮助我将两个文件分开。我不想在MainGUI中合并辅助GUI

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

Main_GUI.py

中学英语


Manish

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

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


这就是为什么人们通常建议只使用tk.tk一次,如果需要更多窗口,则使用tk.Toplevel。

如果要使用多个tk实例,则需要在创建tk.StringVar时传递master关键字。这就解决了我的问题。谢谢你。你想让我写一个正确的答案和解释吗?对我来说,它解决了问题。但对于未来的读者来说,这会更好。每个口译员都有自己的过程和自己的记忆。-这是不对的。所有tcl解释器都在同一个进程中运行,除非您显式地为它们创建一个新进程。@BryanOakley哦,我不知道这一点。它们在不同的线程中运行吗?我将更新我的答案。不,也不是单独的线程。它们都在同一个线程中运行,在同一个进程中。@BryanOakley这就解释了为什么.mainloopn=0即使其主根死了也能运行。它会一直等到所有窗口关闭,即使它们不是主根目录的一部分。每个解释器都不是自己的进程,但它会以这种方式运行。-我也不认为那是真的。单独的过程是完全隔离的。tcl解释器不是。例如,所有tcl解释器都可以访问相同的流程环境变量,它们都在相同的python线程中运行,它们都可以共享一个mainloop调用。虽然它们有相似之处,但说它们的行为类似于过程有点牵强。我认为这样说可能会让人困惑。
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",width=10,height=50, font=("TkDefaultFont", 9, "bold"))
        self.labelframe1.pack(fill="both", expand="yes")
        self.btn2 = tk.Button(self.labelframe1, text="Secondary GUI", bg="orange", fg="black", 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__)), "b.py"), "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()
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=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=53)
        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=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()