首页 > 解决方案 > Tkinter Python- 可以从其他选项卡访问数据的函数

问题描述

我想在 Main_Application 中创建一个函数,该函数可以访问其他选项卡中的数据……我该如何实现?我试图通过键入“Page_2.entry2.insert(0, "test")" 来访问它,但它返回属性错误我将不胜感激任何形式的帮助,因为我已经为此苦苦挣扎了一段时间

class Main_Application(tk.Tk):
def __init__(self):
    super().__init__()
    self.title("HAT")
    first_label = ttk.Label(self, text="lol").pack()
    
    #Notebook
    nb = ttk.Notebook(self)
    nb.pack()
    
    #Frames
    p1 = tk.Frame(nb)
    p2 = tk.Frame(nb)
    p3 = tk.Frame(nb)
    p4 = tk.Frame(nb)
    
    
    nb.add(p1, text="Page1")
    nb.add(p2, text="Page2")
    nb.add(p3, text="Page3")
    nb.add(p4, text="Page4")
    

    Page_1(p1).pack()
    Page_2(p2).pack()

def load_it_all(self):
    print(Page_01(self).user_input.get())
    Page_02.entry2.insert(0, "test")
    # <HERE I WOULD LIKE TO CALL THE DATA FROM 
    #First one prints the data from Page_01 and second i would like to insert data in Page_02.entry2



class Page_1(ttk.Frame):
def __init__(self, container):
    super().__init__(container)
    #Stringvar
    self.user_input = tk.StringVar()
    #Labels
    label = ttk.Label(self, text="HU3: ")

    #Entries
    entry = ttk.Entry(self, textvariable=self.user_input)
    #Inserts
    entry.insert(0, "4500")
    #Buttons
    button = ttk.Button(self, text="Apply", command=lambda: Main_Application.load_it_all(self))
    #Geo
    label.pack()
    entry.pack()
    button.pack()
def test(self):
    print(self.user_input.get())



class Page_2(ttk.Frame):
def __init__(self, container):
    super().__init__(container)
    self.user_input = tk.StringVar()
    label = ttk.Label(self, text="Trend from last cycle ")

    #Entries
    entry2 = ttk.Entry(self, textvariable=self.user_input)
    #Inserts
    # self.entry2.insert(0, "4500")
    #Buttons
    # button = ttk.Button(self, text="Apply", command=self.test2)
    #Geo
    label.pack()
    entry2.pack()
    # button.pack()

标签: pythonoopuser-interfacetkinter

解决方案


您的问题包括

  • 不正确地启动超级
  • 容器太多
  • 随机使用ttk小部件
  • 对范围的了解不足
  • 命名语法错误
  • 不必要的变量

以下是您正在尝试做的工作示例

import tkinter as tk, tkinter.ttk as ttk

class Main(tk.Tk):
    def __init__(self):
        #this is how to properly init a super
        tk.Tk.__init__(self)

        #make notebook fill display
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        
        #Notebook
        nb = ttk.Notebook(self)
        nb.grid(row=0, column=0, sticky='nswe')
        
        #keep a reference to the pages
        self.p1 = Page_1(self)
        self.p2 = Page_2(self)
        
        #tabs
        nb.add(self.p1, text="Page 1")
        nb.add(self.p2, text="Page 2")
        
    
    def load_it_all(self):
        #use the page references to access and share data
        self.p2.input = self.p1.input
        

class Page_1(tk.Frame):
    @property
    def input(self):
        return self.userinput.get()
        
    @input.setter
    def input(self, value):
        self.userinput.delete(0, 'end')
        self.userinput.insert(0, value)
         
    def __init__(self, master, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        tk.Label(self, text="HU3: ").grid(row=0, column=0)
    
        self.userinput = tk.Entry(self)
        self.userinput.grid(row=0, column=1)
        self.input="4500"
        
        tk.Button(self, text="Apply", command=master.load_it_all).grid(row=0, column=2)


class Page_2(tk.Frame):
    @property
    def input(self):
        return self.userinput.get()
        
    @input.setter
    def input(self, value):
        self.userinput.delete(0, 'end')
        self.userinput.insert(0, value)
         
    def __init__(self, master, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        tk.Label(self, text="Trend from last cycle ").grid(row=0, column=0)
    
        self.userinput = tk.Entry(self)
        self.userinput.grid(row=0, column=1)
        

if __name__ == "__main__":
    root = Main()
    root.geometry('800x600')
    root.title("HAT")
    root.mainloop()

推荐阅读