【问题标题】:TTK Notebook Share data between imported tabsTTK Notebook 在导入的选项卡之间共享数据
【发布时间】:2016-03-16 10:17:09
【问题描述】:

我使用 ttk 笔记本设计了一个应用程序,并创建了三个选项卡。他们每个人的布局都截然不同且复杂,他们之间的共同功能和方法很少。

因此,代码文件变得非常难以理解,有这么多行代码专用于布局。

有一种方法可以将每个选项卡创建为单独的模块/文件/类并“导入”它们,以便更易于维护?

编辑:

我遇到的问题是如何在 Frame 子类与主应用程序之间共享属性。 解决方案只是向 Frame 子类添加第二个参数。 更具体地说,我想在两个笔记本中使用 main.py 中的“common_text”和“font”属性。 它现在可以工作了,即使你我不知道这是否是正确的解决方案。

main.py

from Tkinter import *
import ttk
import first_tab
import second_tab

class Application(object):
    def __init__(self, root):
        super(Application, self).__init__()
        self.common_text = "This is a test"
        self.font = ('courier', 10, 'bold')

        self.root = root
        self.notebook = ttk.Notebook(root)
        self.notebook.pack(fill='both', expand = 'yes')
        self.tab_1 = first_tab.tab_frame(self)
        self.tab_2 = second_tab.tab_frame(self)
        self.notebook.add(self.tab_1, text = "First Tab")
        self.notebook.add(self.tab_2, text = "Second Tab")

root = Tk()
app = Application(root)
root.title("Utility")
root.mainloop()

first_tab.py

from Tkinter import *
import ttk

class tab_frame(Frame):
    def __init__(self, relative):
        Frame.__init__(self)

        self.F_1_00 = Frame(self)
        self.F_1_00.grid(column=0, row=0)
        self.F_1_10 = Frame(self)
        self.F_1_10.grid(column=0, row=1)

        self.sign = Label(self.F_1_00, text = relative.common_text, pady=10)
        self.sign.configure(font = relative.font)
        self.sign.grid(column=0, row=0)
        self.reset = Button(self.F_1_10, text = "First", width = 10)
        self.reset.grid(column=2, row=3, padx = 10)

second_tab.py

from Tkinter import *
import ttk

class tab_frame(Frame):
    def __init__(self, relative):
        Frame.__init__(self)

        self.F_2_00 = Frame(self)
        self.F_2_00.grid(column=0, row=0)
        self.F_2_10 = Frame(self)
        self.F_2_10.grid(column=0, row=1)

        self.sign = Label(self.F_2_00, text = relative.common_text, pady=10)
        self.sign.configure(font = relative.font)
        self.sign.grid(column=0, row=0)

        self.reset = Button(self.F_2_10, text = "Second", width = 10)
        self.reset.grid(column=2, row=3, padx = 10)

【问题讨论】:

  • 当然可以。每个选项卡都包含一个框架,每个框架都是一个对象。类可以放在文件中,对象可以在单独的文件中创建。这只是python代码,python代码可以拆分成任意多个文件。尝试一下,当您有更具体的问题时再回来。
  • 感谢您的回答。但是,我不理解反对票。在发布我的答案之前,我不知道我看了多少本书和网站。在发帖之前,我确保没有人提出同样的问题或间接回答了一个例子。我知道你的答案:我没有发布任何代码。也许是因为我不知道从哪里开始?
  • 我们都得到了难以解释的反对票。在这种情况下,很可能是因为您的问题表明您完全缺乏任何研究,并且不包含任何代码来表明您已经尝试过任何事情。如果您进行了研究,请将其作为您问题的一部分。不过,不要只说“我读了一堆书”。你需要自己尝试一些事情。您还应该添加更多细节 - - 您是否编写过 任何 分布在多个文件中的 Python 代码?您问的是编写 Python 代码的最基本部分之一。
  • 我承认这个问题写得不好。
  • 应该/可以取消问题吗?

标签: python tkinter ttk


【解决方案1】:

将笔记本标签放在单独的文件中与将任何其他 python 代码放在单独的文件中没有什么不同。

例如,创建一个名为“page1.py”的文件,内容如下:

import Tkinter as tk

class Page1(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        label = tk.Label(self, text="This is page 1")
        label.pack(fill ="both", expand=True, padx=20, pady=10)

创建第二个内容几乎相同的文件,将“1”更改为“2”:

import Tkinter as tk

class Page2(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        label = tk.Label(self, text="This is page 2")
        label.pack(fill ="both", expand=True, padx=20, pady=10)

现在,创建一个使用这两个文件的主应用程序:

import Tkinter as tk
import ttk
from page1 import Page1
from page2 import Page2

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.notebook = ttk.Notebook(self)
        self.notebook.pack(fill="both", expand=True)

        page1 = Page1(self.notebook)
        page2 = Page2(self.notebook)
        self.notebook.add(page1, text="Page 1")
        self.notebook.add(page2, text="Page 2")

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

如果您需要在这两个类之间共享数据,它们必须共享一些东西。例如,您可以有一个通用字典,它被传递到每个帧。例如:

self.app_data = {...}
page1 = Page1(self.notebook, self.app_data)
page2 = Page2(self.notebook, self.app_data)

另一种解决方案是采用一点模型-视图-控制器模式,其中应用程序是控制器。

page1 = Page1(self.notebook. self)
...
class Page1(tk.Frame):
    def __init__(self, parent, controller)
        self.controller = controller
    ...
    def some_function(self):
        # get data from page 2
        page = self.controller.get_page("Page2")
        data = page.data

在这方面,Tkinter 与任何其他 python 代码没有什么不同。如果两个对象(无论是什么类)需要访问相同的信息,则必须为它们提供信息或提供访问信息的方法。

【讨论】:

  • 我在主类和框架子类之间共享属性时遇到了问题,我从导入的模块中得到了实例化。我通过在 Frame 子类中添加第二个参数来解决。我将在我的主要答案中添加一段代码,即使你同意我应该在之前完成它。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2011-09-08
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多