在Tkinter中在UI和数据模块之间传递数据的最有效方式

时间:2013-09-22 01:39:50

标签: python list python-2.7 tkinter

背景:

我目前的程序基于UI模块,该模块连接到各种数据分析和生成模块。生成,分析数据并将其发送到UI,然后可以通过分析模块操纵和放回数据,然后分析模块再刷新UI。但是,这需要将数据从UI模块导入Analysis模块,然后将分析的数据拉回到界面中,这似乎是在创建程序的新实例并进行每次更改 - 这当然不是我的意图。这是我编写的第一个依赖于同时导入我自己的几个模块的接口,早期的接口要么是自包含的,要么模块之间的数据共享有限。·
问题:

在模块之间传递信息的最有效方法是什么?什么是避免创建“反馈”循环的最佳方法(如下面的简化示例所示)?

示例:

from Tkinter import *
#Example Data_UI module
class Interface_On: 
    def Interface_Elements(self, master):
        self.master=master
        self.master.title("'Feedback' Loop")
        self.c=Canvas(self.master, width=1000, height=1000, bg='black')
        self.c.grid(row=0, rowspan=25, column=0)
        drawing_utility_run=Canvas_Draw()
        drawing_utility_run.canvas_objects(self.c)      

class Canvas_Draw:

    def canvas_objects(self, canvas):
        global new_x, new_y
        self.canvas=canvas
        new_x=[]
        new_y=[]
        from Data_Presets import a
        import Data_Generator
        Generator_run=Data_Generator.Generator()
        Generator_run.generator()       
        from Data_Generator import coordinates_x, coordinates_y
        import Data_Processor
        Process_Data=Data_Processor.Data_Processor()
        Process_Data.Process_Data()
        from Data_Processor import data_set, analysed_set, filtered_set
        for i in range(len(data_set)):
        self.canvas.create_oval(coordinates_x, coordinates_y, coordinates_x+a, coordinates_y+a, ...)

    def move_point:

        #interactive objects etc etc
        new_x.append(event.x) #etc

root=Tk()
run_it=Interface_On()
run_it.Interface_Elements(root)
root.mainloop()

#Seperate Data Analysis module
class Data_Processor:
def Process_Data(self):
    from Data_UI import new_x, new_y #This appears to create the unwanted loop
    #Data Analysis etc
            #What is the most efficient way to get data from the UI into this module and avoid creating a new instance of the UI?

2 个答案:

答案 0 :(得分:0)

我会反过来做,并让Data_Processor调用/实例化GUI类(我假设GUI也生成数据)。因为它知道这个类,所以它可以访问变量,因此不需要传递。在任何情况下,您需要一个处理数据的类/模块,而另一个类在从两个类打印变量时不需要任何传递就可以访问该数据。

无需创建类Canvas_Draw,只需在Interface_On下包含这两个函数即可。另请注意,您应该使用实例对象/变量而不是全局变量,如下例所示。课程http://www.freenetpages.co.uk/hp/alan.gauld/tutclass.htm

的开始教程
class GUI:
    def __init__(self):
        self.x = 3
        self.y = 4

    def print_test_gui(self):
        print self.x, self.y

    def increment_vars(self):
        self.x -= 1
        self.y -= 1

class Data_Processor:
    def __init__(self):
        self.x=1
        self.y=2
        self.GI= GUI()
        self.print_test()
        self.increment_vars()
        self.print_test()
        self.GI.increment_vars()
        self.print_test()

    def print_test(self):
        print "this x and y =", self.x, self.y
        print "GUI x and y  =", self.GI.x, self.GI.y
        self.GI.print_test_gui()
        print

    def increment_vars(self):
        self.x += 1
        self.y += 1

DP=Data_Processor()

答案 1 :(得分:0)

您可以反转上述代码并让GUI调用其他代码。什么是流量?您是否单击GUI中的按钮以生成更多数据,或者只生成一组数据?

try:
    import Tkinter as tk     ## Python 2.x
except ImportError:
    import tkinter as tk     ## Python 3.x

class GUI:
    def __init__(self):
        root = tk.Tk()
        self.x = 3
        self.y = 4

        self.descr = tk.StringVar()
        tk.Label(root, textvariable=self.descr).grid()
        tk.Button(root, text='"Generate" Data', 
                  command=self.increment_vars).grid(row=1)
        self.dp = Data_Processor()
        self.increment_vars()

        root.mainloop()

    def print_test_gui(self):
        print self.x, self.y

    def increment_vars(self):
        self.x -= 1
        self.y -= 1
        self.dp.increment_vars()
        self.descr.set("GUI=%s, %s  Data=%s, %s" %
                      (self.x, self.y, self.dp.x, self.dp.y))

class Data_Processor:
    def __init__(self):
        self.x=1
        self.y=2
        self.print_test()

    def print_test(self):
        print "this x and y =", self.x, self.y

    def increment_vars(self):
        self.x += 1
        self.y += 1

G=GUI()