1

背景:

私の現在のプログラムは、さまざまなデータ分析および生成モジュールに接続された UI モジュールに基づいています。データは生成、分析され、UI に送信されます。そこでデータを操作し、分析モジュールを介して戻すことができます。これにより、UI が更新されます。ただし、これには、UI モジュールから分析モジュールにデータをインポートし、分析したデータをインターフェイスに戻す必要があります。これにより、変更のたびにプログラムの新しいインスタンスが作成されているように見えますが、これはもちろん私の意図ではありませんでした。これは私が書いた最初のインターフェースで、同時にインポートされる私自身のモジュールのいくつかに依存しています。以前のインターフェースは自己完結型であるか、モジュール間のデータの共有が制限されていました。

質問:

モジュール間で情報を渡す最も効率的な方法は何ですか? また、「フィードバック」ループの作成を回避する最善の方法は何ですか (以下の簡単な例で示します)。

例:

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?
4

2 に答える 2

0

上記のコードを逆にして、GUI に他のコードを呼び出させることができます。流れは?GUI のボタンをクリックしてさらにデータを生成しますか? それとも、生成されるデータ セットは 1 つだけですか?

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()
于 2013-09-23T19:10:01.830 に答える
0

私はそれを逆にして、Data_Processor に GUI クラスを呼び出し/インスタンス化させます (GUI もデータを生成すると想定しています)。このクラスを認識しているため、変数にアクセスできるため、渡す必要はありません。いずれにせよ、データを処理する 1 つのクラス/モジュールが必要であり、他のクラスは、両方のクラスから変数を出力する際に​​以下で行われるように、渡すことなくそのデータにアクセスします。

クラス Canvas_Draw を作成する必要はありません。これら 2 つの関数を 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()
于 2013-09-22T18:33:11.390 に答える