Tkinter 在(笔记本)选项卡之间共享数据
Tkinter Share data between (Notebook) Tabs
我在标题为“TTK Notebook Share Data Between Imported Tabs”下找到了一个非常有趣的post。
这里是link:[
这是主要应用程序:
我按照那里的描述创建了它并且有效。
但是如何在这两个 类 之间共享数据?
例如,如果我将以下代码写入主应用程序:
self.hello = "Hello World"
page1 = Page1(self.notebook, self.hello)
page2 = Page2(self.notebook, self.hello)
我收到错误消息:
page1 = Page1(self.notebook, self.app_data)
TypeError: init() 接受 2 个位置参数,但给出了 3 个
这几天一直在研究,可惜我不明白错误在哪里。
如果有人能在这里帮助我,我会很高兴。
这是主要应用程序 (main.py):
import tkinter as tk
from tkinter 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="Tab 1")
self.notebook.add(page2, text="Tab 2")
self.hello = "Hello World"
page1 = Page1(self.notebook, self.hello)
page2 = Page2(self.notebook, self.hello)
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()
这是第 1 页“page1.py”:
import tkinter as tk
class Page1(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Das ist Tab 1"+ self.hello)
label.pack(fill ="both", expand=True, padx=20, pady=10)
这是第 2 页“page2.py”:
import tkinter as tk
class Page2(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Das ist Tab 2"+ self.hello)
label.pack(fill ="both", expand=True, padx=20, pady=10)
错误告诉你到底出了什么问题:
page1 = Page1(self.notebook, self.app_data)
TypeError: __init()__ takes 2 positional arguments but 3 were given
如我们所见,您的 Page2.__init__
有两个位置参数:self
和 parent
。当您执行 Page1(self.notebook, self.app_data)
时,self
会自动作为第一个参数传递给 __init__
。 self.notebook
作为 parent
传递,并且没有第三个参数接受 self.app_data
。
您需要修改__init__
接受数据参数:
class Page2(tk.Frame):
def __init__(self, parent, app_data):
tk.Frame.__init__(self, parent)
self.app_data = app_data
请注意,这会导致另一行失败,因为您还调用了 Page2
,但此处没有额外的参数:
page1 = Page1(self.notebook)
不清楚为什么要创建 page1
两次,但您需要在创建它的方式上保持一致。
我在标题为“TTK Notebook Share Data Between Imported Tabs”下找到了一个非常有趣的post。
这里是link:[ 这是主要应用程序: 我按照那里的描述创建了它并且有效。
但是如何在这两个 类 之间共享数据? 例如,如果我将以下代码写入主应用程序: 我收到错误消息: page1 = Page1(self.notebook, self.app_data) TypeError: init() 接受 2 个位置参数,但给出了 3 个 这几天一直在研究,可惜我不明白错误在哪里。
如果有人能在这里帮助我,我会很高兴。 这是主要应用程序 (main.py): 这是第 1 页“page1.py”: 这是第 2 页“page2.py”:self.hello = "Hello World"
page1 = Page1(self.notebook, self.hello)
page2 = Page2(self.notebook, self.hello)
import tkinter as tk
from tkinter 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="Tab 1")
self.notebook.add(page2, text="Tab 2")
self.hello = "Hello World"
page1 = Page1(self.notebook, self.hello)
page2 = Page2(self.notebook, self.hello)
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()
import tkinter as tk
class Page1(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Das ist Tab 1"+ self.hello)
label.pack(fill ="both", expand=True, padx=20, pady=10)
import tkinter as tk
class Page2(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Das ist Tab 2"+ self.hello)
label.pack(fill ="both", expand=True, padx=20, pady=10)
错误告诉你到底出了什么问题:
page1 = Page1(self.notebook, self.app_data)
TypeError: __init()__ takes 2 positional arguments but 3 were given
如我们所见,您的 Page2.__init__
有两个位置参数:self
和 parent
。当您执行 Page1(self.notebook, self.app_data)
时,self
会自动作为第一个参数传递给 __init__
。 self.notebook
作为 parent
传递,并且没有第三个参数接受 self.app_data
。
您需要修改__init__
接受数据参数:
class Page2(tk.Frame):
def __init__(self, parent, app_data):
tk.Frame.__init__(self, parent)
self.app_data = app_data
请注意,这会导致另一行失败,因为您还调用了 Page2
,但此处没有额外的参数:
page1 = Page1(self.notebook)
不清楚为什么要创建 page1
两次,但您需要在创建它的方式上保持一致。