1

GUI.py と calcs.py の 2 つのモジュールを持つアプリで、GUI が calcs から関数をインポートして使用する場合、calcs 関数が GUI の進行状況バーを更新するための良い方法は何ですか?

すべてのコードを 1 つのモジュールに収めていたときは、以前は単純でした。私はそれを2つにリファクタリングしました(まだ学習中です...)が、これは現在修正できない唯一のものです。

たとえば、非常に単純な例として、GUI.py モジュールには次のものがあります。

import tkinter as tk
import tkinter.ttk as ttk
import calc as c

class GUI(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.prog = tk.DoubleVar()
        self.result = tk.StringVar()
        self.label = ttk.Label(textvariable = self.result)
        self.progbar = ttk.Progressbar(self, maximum = 10, variable = self.prog)
        self.button= ttk.Button(self, text = 'Go', command = lambda: self.result.set(c.stuff()))
        self.label.pack()
        self.progbar.pack()
        self.button.pack()

a = GUI()
a.mainloop()

と calc.py を持つ:

def stuff():
    counter = 0
    for i in range(1, 11, 1):
        counter += 1
        # find a way to pass the value of counter to the GUI progress bar
        # do lots of stuff that takes quite some time
    return 'hey, a result!'

calc 関数のプログレス カウンターを GUI のプログレス バー変数にリンクする良い方法は何ですか?

それらが一緒に 1 つのモジュールにあるときは、もちろん十分に単純でした。

prog.set(counter)
a.update_idletasks()

しかし、もはや。これについてグーグルで読んで、スレッド化し、キューを使用してそれらをリンクしようとしましたが、これはa)やり過ぎのように見え、b)は困難でした...動作しませんでした...

4

1 に答える 1

1

プログレス バーを更新する GUI モジュールで関数を作成し、その関数への参照を calc 関数の引数として渡します。

# GUI.py
class GUI(...):
    def __init__(...):
        ...
        self.button= ttk.Button(..., command = lambda: c.stuff(self))
        ...
   def update_progress(self):
       ...

# calc.py
def stuff(gui):
    for i in range(...):
        ...
        gui.update_progress()
于 2013-10-05T12:46:55.753 に答える