【问题标题】:Tkinter - code structure, construction and organisation - application append sub-frameTkinter - 代码结构、构造和组织 - 应用程序附加子帧
【发布时间】:2021-08-04 14:59:16
【问题描述】:

我想制作一个自动创建独立子帧的 tkinter 应用程序。我对 tkinter 代码了解一点,所以我可以自己创建所有这些 ComboboxButton 和其他简单的东西。我只是需要一些关于结构的主要构造、类和函数、回调函数的帮助。

有一些说明如何使用该应用程序:

设置combobox1,下一组combobox2 取决于combobox1 中的选择(我知道该怎么做)。 当您单击TopFrame 中的+ 按钮时,这会在“不可见”GroupOfFrame 区域中附加一个FrameX(可能不需要此GroupOfFrame 框架)。

在单个子帧FrameX 中,将combobox3 设置为取决于combobox2combobox1 选择的值。接下来,您可以按下一个按钮 (button2.X),该按钮将执行一些代码,这些代码使用 3 个组合框(1、2 和 3.X)的选择(以及同一子框架中的一些条目)。

每个子帧都需要独立,但所有button2.X 调用与combobox3.X 相关的相同函数(我不知道该怎么做)。

您可以单击- 按钮,该按钮将删除相关的单个子框架并向上拖动所有其他子框架。

如果可能,主按钮 button1 运行所有其他按钮 button2.X。 您可以根据需要添加或删除子帧。

目的是我不知道如何组织我的代码。 我希望这个描述是可以理解的。

我没有放任何代码,因为我不知道如何开始这个项目(对不起)。我尝试了一些东西,但这些都不合适。我不需要完整的代码示例。

【问题讨论】:

  • 您可能应该寻找一些 tkinter 教程。
  • 你的课有多好?您是否尝试过将TopFrame 纳入自己的课程?你打算在你的程序中使用什么数据结构?你能告诉我们你最好的尝试吗?
  • 网上没有这个教程。我不想在主 Frame 应用程序顶部打开 TopFrame,如果可能的话,我希望所有内容都在同一个框架中。我会再写一些代码放在下一个
  • @RamboSushi 将所有内容放在同一个框架中将非常困难。 Frames 旨在将您的 GUI 拆分为多个部分。这使得每个部分的编码变得更加容易。如果每个部分都是它自己的类,那么创建/调试它应该会变得更容易
  • @TheLizzard 好的,我会尝试使用更多的 TopFrame。但是我的课不是很好。

标签: python python-3.x tkinter


【解决方案1】:

解决方案是创建两个类。将第一个类视为一个行为很像笔记本的自定义小部件。主要区别在于,您有一个垂直的框架堆栈,而不是选项卡。它会根据您的绘图在TopFrame 中创建小部件,并且在底部具有添加和删除框架的方法。

第二个类代表一个“标签”或一个框架/组合/条目/按钮组。它负责创建自己,并被赋予第一个类的引用,以便删除自己并做其他事情。

我已经包含了一些示例代码来帮助您入门。它不会在顶部框架中添加组合框,因为我认为它与您要询问的代码的整体结构有些无关。

在下面的代码中,FrameStack 是第一类。它会根据您的图表创建TopFrameGroupOfFrames,并添加用于添加和删除框架的函数。

SubFrame 表示组合框、条目小部件、大按钮和小按钮的组合。注意减号按钮是如何回调第一个类的delete_frame 方法的。

import tkinter as tk
from tkinter import ttk

class FrameStack(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        self.subframes = []
        self.topFrame = tk.Frame(self)
        self.groupOfFrames = tk.Frame(self, height=200)
        self.topFrame.pack(side="top", fill="x")
        self.groupOfFrames.pack(side="top", fill="both", expand=True)

        self.add = tk.Button(self.topFrame, text="+", command=self.add_frame)
        self.add.pack(side="right")

    def delete_frame(self, frame):
        self.subframes.remove(frame)
        frame.destroy()

    def add_frame(self):
        f = SubFrame(parent=self.groupOfFrames, controller=self)
        self.subframes.append(f)
        f.pack(side="top", fill="x")

class SubFrame(tk.Frame):
    def __init__(self, parent, controller):
        super().__init__(parent)
        self.parent = parent
        self.controller = controller

        self.cb = ttk.Combobox(self)
        self.entry = tk.Entry(self)
        self.main_button = tk.Button(self, width=10)
        self.remove_button = tk.Button(self, text="-", command=self.remove)

        self.grid_rowconfigure(0, weight=1)
        self.cb.grid(row=0, column=0, sticky="ew")
        self.entry.grid(row=1, column=0, sticky="ew")
        self.main_button.grid(row=0, column=1, rowspan=2, sticky="nsew")
        self.remove_button.grid(row=1, column=2, sticky="se")

    def remove(self):
        self.controller.delete_frame(self)

root = tk.Tk()
root.geometry("400x400")

fs = FrameStack(root)
fs.pack(fill="both", expand=True)
root.mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多