如何在Tkinter中将2D数组从一个类传递到另一个类?

时间:2017-05-17 10:55:02

标签: python arrays python-2.7 tkinter

我正在尝试使用Tkinter编写我的第一个应用程序。我根本无法理解如何将2D数组中的变量数据(由用户输入)从一个类传递到另一个类。试图改变一些东西,但没有结果。我将非常感谢任何帮助或建议。

from Tkinter import *

date_index = [2017, 2018, 2019, 2020, 2021]
product_name = ['product 1', 'product 2', 'product 3', 'product 4', 'product 5']

class main: 
    def __init__(self, master):
        self.master = master
        self.master.title('revenue calc')

        Button(self.master, text = 'quantity', command=self.q_button).pack()
        Button(self.master, text = 'prices', command=self.p_button).pack()

        self.master.mainloop()

    def q_button(self):
        q_child(self.master)

    def p_button(self):
        p_child(self.master)

class q_child:
    def __init__(self, master):
        self.slave = Toplevel(master)
        self.slave.title('quantity')

        self.corner_frame = Frame(self.slave)
        self.corner_frame.grid(row=0, column=0)

        self.left_frame = Frame(self.slave)
        self.left_frame.grid(row=1, column=0)

        self.head_frame = Frame(self.slave)
        self.head_frame.grid(row=0, column=1)

        self.main_frame = Frame(self.slave)
        self.main_frame.grid(row=1, column=1)

        self.button_frame = Frame(self.slave)
        self.button_frame.grid(row=2, column=1)


        for i in range(len(product_name)):
            self.testlabel = Label(self.left_frame, text = product_name[i])
            self.testlabel.grid(row=i, column=0)

        for j in range(len(date_index)):
            self.testlabel1 = Label(self.head_frame, width = 5, text = date_index[j])
            self.testlabel1.grid(row=0, column=j)

        self.q0 = []

        for j in range(len(date_index)):
            self.q0.append([])
            for i in range(len(product_name)):
                self.q0[j].append(Entry(self.slave, width = 5, text=""))
                self.q0[j][i].grid(row=j, column=i, in_ = self.main_frame)

        self.save_q_button = Button(self.button_frame, text = 'save', command = self.save_q_data)
        self.save_q_button.pack()

    def save_q_data(self):
        self.q = []

        for j in range(len(date_index)):
            self.q.append([])
            for i in range(len(product_name)):  
                self.q[j].append(float(self.q0[j][i].get()))

class p_child:
    def __init__(self, master):
        self.slave = Toplevel(master)
        self.slave.title('prices')

        self.corner_frame = Frame(self.slave)
        self.corner_frame.grid(row=0, column=0)

        self.left_frame = Frame(self.slave)
        self.left_frame.grid(row=1, column=0)

        self.head_frame = Frame(self.slave)
        self.head_frame.grid(row=0, column=1)

        self.main_frame = Frame(self.slave)
        self.main_frame.grid(row=1, column=1)

        self.button_frame = Frame(self.slave)
        self.button_frame.grid(row=2, column=1)


        for i in range(len(product_name)):
            self.testlabel = Label(self.left_frame, text = product_name[i])
            self.testlabel.grid(row=i, column=0)

        for j in range(len(date_index)):
            self.testlabel1 = Label(self.head_frame, width = 5, text = date_index[j])
            self.testlabel1.grid(row=0, column=j)

        self.p0 = []

        for j in range(len(date_index)):
            self.p0.append([])
            for i in range(len(product_name)):
                self.p0[j].append(Entry(self.slave, width = 5, text=""))
                self.p0[j][i].grid(row=j, column=i, in_ = self.main_frame)

        self.save_p_button = Button(self.button_frame, text = 'save', command = self.save_p_data)
        self.save_p_button.pack()

    def save_p_data(self):
        self.rev = []
        self.revall = []
        self.p = []

        for j in range(len(date_index)):
            self.rev.append([])
            self.p.append([])
            self.s = 0
            for i in range(len(product_name)):  
                self.p[j].append(float(self.p0[j][i].get()))
                self.rev[j].append(self.p[j][i]*q[j][i]) # NameError: global name 'q' is not defined
                self.s += self.rev[j][i]
            self.revall.append(self.s)  

root = Tk()
main(root) 

1 个答案:

答案 0 :(得分:1)

请参阅下面的代码简化版,其中显示了如何将数据(在本例中为单个条目框的文本)从TopLevel()窗口传回主窗口。

基本上,在q_child类中,将要返回的数据存储在名为self.data的属性中,以便在返回主类时可以访问它致电q.data

您甚至可以将此数据存储在主窗口的master属性中,名称为q_data,以便可以在p_child课程中通过master.q_data进行访问

import Tkinter as tk

class main: 
    def __init__(self, master):
        self.master = master
        self.master.q_data = "No data entered"
        tk.Button(self.master, text='quantity', command=self.q_button).pack()
        tk.Button(self.master, text='prices', command=self.p_button).pack()
        self.master.mainloop()

    def q_button(self):
        # Create a TopLevel window to get user input
        q = q_child(self.master)
        # Wait for the user to close the TopLevel window
        self.master.wait_window(q.slave)
        # Store the data input by the user in the main window's "master" attribute
        self.master.q_data = q.data

    def p_button(self):
        # Create a TopLevel window to use the user input data
        p = p_child(self.master)
        # Wait for the user to close the TopLevel window
        self.master.wait_window(p.slave)

class q_child:
    def __init__(self, master):
        # Create a TopLevel window, and grab focus
        self.slave = tk.Toplevel(master)
        self.slave.grab_set()

        # Add an Entry box and a button
        self.q_entry = tk.Entry(self.slave, text="")
        self.q_entry.pack()
        tk.Button(self.slave, text='save', command=self.save_q_data).pack()

        # Initialize the data to be returned
        self.data = "No data entered"

    def save_q_data(self):
        # Update the data to be returned with the Entry box content
        self.data = self.q_entry.get()
        # Close the TopLevel window
        self.slave.destroy()

class p_child:
    def __init__(self, master):
        # Create a TopLevel window, and grab focus
        self.slave = tk.Toplevel(master)
        self.slave.grab_set()

        # Retrieve the user-input data from the "master"
        q_data = master.q_data
        # Show the data on a label
        tk.Label(self.slave, text=q_data).pack()
        # Add a button to go back
        tk.Button(self.slave, text='back', command=self.slave.destroy).pack()

root = tk.Tk()
main(root)

重要self.master.wait_window(q.slave)确保主类在继续运行之前等待TopLevel窗口关闭。