Python 将图形界面层叠在一起

Python 将图形界面层叠在一起,python,tkinter,graphics,Python,Tkinter,Graphics,我有一个主程序窗口,带有和,用于调用计算模块 from tkinter import Menu, Label, Tk, Frame, Scrollbar, Canvas, N, E, S import runpy import Bolt_connection from importlib import reload # Program window dimensions root = Tk() root.title("Name") root.geometry("1

我有一个主程序窗口,带有和,用于调用计算模块

from tkinter import Menu, Label, Tk, Frame, Scrollbar, Canvas, N, E, S
import runpy
import Bolt_connection
from importlib import reload

# Program window dimensions
root = Tk()
root.title("Name")
root.geometry("1260x700")
root.update()
MaxX = root.winfo_width()
MaxY = root.winfo_height()
canvas = Canvas(root, width=MaxX, height=MaxY, bg="white")
scroll_y = Scrollbar(root, orient="vertical", command=canvas.yview)

frame = Frame(canvas)
for i in range(50):
    Label(frame).grid()
    i += 1
canvas.create_window(0, 0, anchor='nw', window=frame)
canvas.update_idletasks()

canvas.configure(scrollregion=canvas.bbox('all'),
                 yscrollcommand=scroll_y.set)

canvas.grid()
scroll_y.grid(row=0, sticky=E + N + S)
main_menu = Menu()

# Submenu for Export to...
file_menu = Menu(tearoff=0)
help_menu = Menu(file_menu, tearoff=0)
help_menu_export_to = Menu(help_menu, tearoff=0)
help_menu_export_to.add_command(label="Excel")
help_menu_export_to.add_command(label="Word")


def start_bolt_connection():
    import Bolt_connection


def start_key_connection():
    import Key_connection


# Submenu for Part calculation selection
calculation_selection_menu = Menu(tearoff=0)
help_menu2 = Menu(calculation_selection_menu, tearoff=0)
help_menu2_part_calculation_selection = Menu(help_menu2, tearoff=0)
B2 = help_menu2_part_calculation_selection.add_command(label="Bolted (screw) connection", command=start_bolt_connection)
help_menu2_part_calculation_selection.add_command(label="Key connection", command=start_key_connection)
help_menu2_part_calculation_selection.add_command(label="Pinned connection")

# File menu
file_menu.add_command(label="New")
file_menu.add_command(label="Save")
file_menu.add_cascade(label="Export to...", menu=help_menu_export_to)
file_menu.add_command(label="Open")
file_menu.add_command(label="Exit")

# Main menu
main_menu.add_cascade(label="File", menu=file_menu)
main_menu.add_cascade(label="About")
main_menu.add_cascade(label="Help")
main_menu.add_cascade(label="Part calculation selection", menu=help_menu2_part_calculation_selection)


runpy.run_module('Bolt_connection')
root.config(menu=main_menu)
root.mainloop()
我想看到一个程序启动时的窗口。然后,当您单击其中一个菜单按钮(例如,键连接)时,框架应更新并显示新模块的图形界面。单击后,窗口应该是这样的

问题在于,当显示新模块的图形部分时,旧模块的图形部分不会被擦除,并且会被删除。如何使程序删除旧模块的图形部分?
grid\u remove()
reload()
函数没有帮助。

关于我运行程序时想要得到什么的附加说明。

  • 节目开始了
  • 此时会出现主窗口,其中计算模块已在运行,默认情况下已安装。在这种情况下,“螺栓连接”。窗口现在应该看起来像
  • 用户从菜单中选择一个计算模块。在本例中,“键连接”。先前模块的图形部分将被删除,新模块将显示。窗口现在应该看起来像
  • UPD

    为了更好地理解这个问题,请添加到项目文件所在的google drive的链接。


    此文件夹中有两个txt文件,其中包含导出模块的代码,因此您无需将项目下载到计算机并运行它。

    main.py

    import tkinter as tk
    import Mod1
    import Mod2
    
    root = tk.Tk()
    m1 = Mod1.Model(root)
    m2 = Mod2.Model(root)
    m1.grid(column= 0, row=0)
    m2.grid(column = 0 ,row=0)
    
    def callback():
        m1.lift()    
    b = tk.Button(text='click me', command=callback)
    b.grid(column=0,row=1)
    
    from __main__ import tk
    
    class Model(tk.Frame):
        def __init__(self, master):
            tk.Frame.__init__(self, master)
            self.master = master
            self.configure(bg="red", width=300, height=300)
    
    from __main__ import tk
    
    class Model(tk.Frame):
        def __init__(self, master):
            tk.Frame.__init__(self, master)
            self.master = master
            self.configure(bg="blue", width=300, height=300)
    
    Mod1.py

    import tkinter as tk
    import Mod1
    import Mod2
    
    root = tk.Tk()
    m1 = Mod1.Model(root)
    m2 = Mod2.Model(root)
    m1.grid(column= 0, row=0)
    m2.grid(column = 0 ,row=0)
    
    def callback():
        m1.lift()    
    b = tk.Button(text='click me', command=callback)
    b.grid(column=0,row=1)
    
    from __main__ import tk
    
    class Model(tk.Frame):
        def __init__(self, master):
            tk.Frame.__init__(self, master)
            self.master = master
            self.configure(bg="red", width=300, height=300)
    
    from __main__ import tk
    
    class Model(tk.Frame):
        def __init__(self, master):
            tk.Frame.__init__(self, master)
            self.master = master
            self.configure(bg="blue", width=300, height=300)
    
    Mod2.py

    import tkinter as tk
    import Mod1
    import Mod2
    
    root = tk.Tk()
    m1 = Mod1.Model(root)
    m2 = Mod2.Model(root)
    m1.grid(column= 0, row=0)
    m2.grid(column = 0 ,row=0)
    
    def callback():
        m1.lift()    
    b = tk.Button(text='click me', command=callback)
    b.grid(column=0,row=1)
    
    from __main__ import tk
    
    class Model(tk.Frame):
        def __init__(self, master):
            tk.Frame.__init__(self, master)
            self.master = master
            self.configure(bg="red", width=300, height=300)
    
    from __main__ import tk
    
    class Model(tk.Frame):
        def __init__(self, master):
            tk.Frame.__init__(self, master)
            self.master = master
            self.configure(bg="blue", width=300, height=300)
    
    解释


    在模块中,您将模型定义为tk.Frame的子类,这使您能够像处理tk.Frame一样处理模型。

    部分问题可能是使用几何体管理器。你知道columnspan的事吗?那么可能是照片的大小。您可能需要实现使图片大小相等的元素,或者使用PIL调整图片大小。如果我们看不到完整的代码并让我们猜测,就很难找出问题所在。也许您将更新您的问题。在框架或窗口中,您只能使用pack()或grid()。你和经理混在一起吗?不是。我只使用
    网格
    。提交所有代码不允许限制问题中的字符数。我将尝试将项目上传到该网站。我想我误解了你的意图。我想你会做同样大小的模块,如果你想展示它们,你会把它们举起来吗?是吗?对。我想在主窗口中用专门为它们设计的框架显示这些模块。非常感谢!稍后我将尝试在代码中使用它。为了以防万一,我在问题的描述中添加了一个指向Google驱动器的链接,其中包含项目文件夹。欢迎您。但是,一旦我的答案解决了你的问题,请立即投票并接受我的答案。:)你的代码不能完全满足我的需要。代码首先创建一个对象m1,然后创建m2。也就是说,m1小于m2。按下按钮时,对象m1上升到对象m2上方。如果只有两个或三个对象,那么这不是问题。但如果有10个,那么它将获得大量资源。我希望当按下按钮时,旧对象从帧中移除(擦除),并绘制新对象。@Nemo现在您的模型类似于tk.Frames,您可以使用widget.destroy()或您想要的。你呢?这只是一个例子,但我可以把它添加到答案中。