背景:
我目前的程序基于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?
答案 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()