【问题标题】:Layering graphical interfaces on top of each other将图形界面相互叠加
【发布时间】:2020-06-28 08:07:23
【问题描述】:

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

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()

我想在程序启动时看到一个类似于this 的窗口。然后,当您单击其中一个菜单按钮(例如,键连接)时,框架应更新并显示新模块的图形界面。点击后窗口应该看起来像this

问题是在显示新模块的图形部分时,旧模块的图形部分没有被擦除,他们overlap each other。如何让程序删除旧模块的图形部分? grid_remove()reload() 函数没有帮助。

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

  1. 程序启动。
  2. 主窗口出现,计算模块已经运行,默认安装。在这种情况下,“螺栓连接”。窗口现在应该看起来像 this
  3. 用户从菜单中选择一个计算模块。在这种情况下,“键连接”。前一个模块的图形部分被擦除,并显示新模块。窗口现在应该看起来像 this

UPD

为了更好地理解问题,请添加指向项目文件所在的 google drive 的链接。 https://drive.google.com/drive/folders/110OrRqlfzGmswg8cGHO3-C4VxfRj1sos?usp=sharing

在这个文件夹中有两个txt文件,里面有导出模块的代码,这样你就不用把工程下载到电脑上运行了。

【问题讨论】:

  • 部分问题可能是几何管理器的使用。你知道柱跨度吗?那么可能是图片的大小。您可能需要实现一个元素,它使图片的大小相等,或者您使用 PIL 调整它们的大小。如果我们看不到完整的代码并让我们猜测,就很难找出问题所在。也许你会更新你的问题。
  • 在 Frame 或窗口中,您只能使用 pack() 或 grid()。你们混合经理吗?
  • 不是。我只使用grid。提交所有代码不允许限制问题中的字符数。我会尝试将项目上传到网站。
  • 我想我误解了你想要做什么。我想如果你想展示它们,你会做同样大小的模块并将它们抬起来吗?不是吗?
  • 对。我想在主窗口中专门为它们设计的框架中显示这些模块。

标签: python tkinter graphics


【解决方案1】:

ma​​in.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)

Mod1.py

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)

Mod2.py

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 一样处理您的模型。

【讨论】:

  • 非常感谢!稍后我将尝试在我的代码中使用它。以防万一,我在问题的描述中添加了一个指向带有项目文件夹的 Google 驱动器的链接。
  • 不客气。但是,请在解决您的问题后立即投票并接受我的回答。 :)
  • 您的代码不能完全满足我的需要。您的代码首先创建一个对象 m1,然后是 m2。也就是说,m1 在 m2 之下。当按下按钮时,对象 m1 上升到对象 m2 上方。如果只有两个或三个对象,那么这不是问题。但是如果有10个,那么它会得到很多资源。我希望当按下按钮时,从框架中删除(删除)旧对象,并绘制新对象。
  • @Nemo 现在你的模型就像 tk.Frames 你可以使用 widget.destroy() 或者你想要的。不是吗?这只是一个示例,但我可以将其添加到答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 2017-01-20
  • 2019-04-10
  • 2018-09-28
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
相关资源
最近更新 更多