2017-05-12 2 views
0

Pythonで長い計算で使用される変数を制御する簡単なグラフィカルインターフェイスが必要です。私が問題を説明し、私がよく知っている解決策をMATLABに示しましょう。私はむしろPythonの初心者です。長時間の計算中に変数を制御するための最小限のグラフィカルインターフェイス

私はこの関数fに変数xを使用しています。

function f 

x = 1; 
for n = 1:10 
    fprintf('%f\n', x) 
    pause(1) 
end 

end 

私は、グラフィカルなインターフェイスを持つ計算中xの値を変更できるようにしたいです。 Matlabでは、これは比較的正確に行うことができます。最初にxglobalという変数に変更してから、xを更新する単純なコールバックでウィジェットを作成する必要があります。最終的なコードは:

function computation_with_gui 
% the main function simply creates the control and calls f. 
    uicontrol('Style', 'slider', 'Min', 0, 'Max', 100, 'Position', [0 0 400 20], 'Callback', @callback) 
    f(); 
end 

function callback(h, d) 
% the callback simply updates x 
    global x 
    x = h.Value; 
end 

function f 
% function f now declares x as global 
    global x 
    x = 1; 
    for n = 1:10 
     fprintf('%f\n', x) 
     pause(1) 
    end 
end 

上記のスクリプトは、スライダー(ここでは重要ではない別のウィジェットかもしれない)を表示し、計算を開始します。スライダーは計算中にフリーズされません。xの値を制御するために使用することができます。これはfで表示されます。最後に、fが完了するとプログラムは停止します。全体として、このシンプルなグラフィカルインターフェイスをfに追加するために必要なコードは、ごくわずかです。

私の質問は、Pythonで何か似たようなことをすることですか?私は明らかにこの場合の簡潔さを支持する。私の好みはPyQt5に行きます(単にそれが私の設定に付属しているからです)。しかし、もし別のフレームワークがもっと簡潔にすることができれば、それは良いことです。ウィジェットは、これを簡単にするならば、スライダー以外の何かになります。

+0

[guidata](https://pypi.python.org/pypi/guidata)パッケージを使用してください。それはPyQt5に基づいているので、あなたのためにインストールするのは簡単です。 – TheBlackCat

+0

Python GUIに関するチュートリアルをお探しですか?それはそれがどのように見えるかです。 –

+0

@ mad-physicistそうですね。 Matlabは約10行で私の仕事のための作業GUIを提供することができます。私はそれがPythonでも可能かどうかを尋ねています。 GUIを書くことを学ぶことは、より広範で複雑な問題です。たとえば、私のMatlabコードでは、実際にMatlabのGUI知識は必要ありません。 – user1735003

答えて

0

MATLABのものと非常によく似たことができます。

import sys, threading, time 
from PyQt5.QtCore import Qt 
from PyQt5.QtWidgets import QApplication, QLabel, QSlider, QVBoxLayout, QWidget 

x = 1 

class GUI(QWidget): 
    def __init__(self, parent = None): 
     super().__init__(parent) 

     self.slider = QSlider(Qt.Horizontal) 
     self.slider.setMinimum(0) 
     self.slider.setMaximum(100) 
     self.slider.setValue(x) 
     self.slider.setTickPosition(QSlider.TicksBelow) 
     self.slider.setTickInterval(5) 

     layout = QVBoxLayout() 
     layout.addWidget(self.slider) 

     self.setLayout(layout) 
     self.slider.valueChanged.connect(self.valuechange) 

    def valuechange(self): 
     global x 
     x = self.slider.value() 

def process(gui): 
    for n in range(10): 
     print(x) 
     time.sleep(1) 
    gui.close() 

def main(): 
    app = QApplication(sys.argv) 
    gui = GUI() 
    gui.show() 
    threading.Thread(target=process, args=(gui,)).start() 
    sys.exit(app.exec()) 

if __name__ == '__main__': 
    main() 

をあなたが見ることができるように、いくつかの違いがここにあります:私は証明するためにTutorialsPointからPyQt slider exampleを適応します。主なスレッドはapp.execによってブロックされるため、バックグラウンドスレッドでタスクを開始する必要があります。もう1つは、処理関数にGUIが完了したことを知らせる方法が必要です。これは、GUIウィンドウへの参照を渡すことで実装しました。

グローバル変数は一般的には悪い考えですが、ここではMATLABコードからの直接変換として使用しました。

+0

非常に便利です。ありがとう。 – user1735003

関連する問題