2017-06-08 3 views
-1

おかげさまで、ありがとうございました。Python - Tkinter GUIで複数のモジュールを更新

私は2つの.pyファイルを持っています.1つはGUIを実行し、もう1つは基本的な計算を行い、GUIの入力でグラフを作成し、コンソールに出力します。値は2回、計算ファイルから1回、GUIファイルからもう一度印刷されます。

問題は、入力を更新すると出力が更新されず、グラフも更新されないということです。これに関する助けをあらかじめありがとうございます。

GUI(test1GUI.py):

import tkinter as tk 
from tkinter import ttk 

import csv 

def To_Print(self): 

    if len(self.e_xf.get()) != 0: 

     Write_Inputs_To_CSV(self) 

     import test1Eqm 

     test1Eqm.Pre_Output() 

     Rmin = test1Eqm.Outputs('Rmin') 
     xf = float(self.e_xf.get())/100 

     print('xf (fromGUI) = ', xf) 
     print('Rmin (fromGUI) = ', Rmin) 

     del test1Eqm 

    else: 
     print('Enter All Inputs') 

def Write_Inputs_To_CSV(self): 

    xf = float(self.e_xf.get())/100 


    with open('TestInputs.csv', 'w', newline='') as csvfile: 

     filewriter = csv.writer(csvfile, delimiter=',', 
           quotechar='|', quoting=csv.QUOTE_MINIMAL) 

     filewriter.writerow(['Variable', 'Value']) 

     filewriter.writerow(['xf', xf]) 


class ChemEngApp(tk.Tk): 

    def __init__(self, *args, **kwargs): 

     tk.Tk.__init__(self, *args, **kwargs) 

     tk.Tk.wm_title(self, "ChemEng") 

     container = tk.Frame(self) 
     container.pack(side="top", fill="both", expand = True) 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 

     for F in (StartPage, PageOne): 

      frame = F(container, self) 
      self.frames[F] = frame 
      frame.grid(row=0, column=0, sticky="nsew") 

     self.show_frame(StartPage) 

    def show_frame(self, cont): 

     frame = self.frames[cont] 
     frame.tkraise() 


class StartPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 

     ##### Making Labels ##### 

     self.l_Title = ttk.Label(self, text="Start Page") 
     self.l_Title.grid(row=0, columnspan = 2) 

     self.l_xf = ttk.Label(self, text="xA of Feed (%)") 
     self.l_xf.grid(row=1, sticky="e", padx=5) 

     ##### Making Entry Boxes ##### 

     self.e_xf = ttk.Entry(self) 
     self.e_xf.grid(row=1, column=1)    

     self.b_Run = ttk.Button(self, text="Click to Run", command=lambda: RUN(self)) 
     self.b_Run.grid(row=2, column=0, columnspan = 2) 

     def RUN(self): 

      To_Print(self) 

class PageOne(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 

if __name__ == '__main__': 
    app = ChemEngApp() 
    app.mainloop() 

計算(test1Eqm.py):

import matplotlib.pyplot as plt 
import numpy as np 

#-------------------------------------------------------------------------------------------------------------------------------- 
# Getting variables from .csv 

import csv 

Variables = [] 
Values = [] 

def getval(x): 

    with open('TestInputs.csv', 'rt') as g: 
     reader = csv.reader(g) 

     # read file row by row 
     rowNr = 0 
     for row in reader: 
      # Skip the header row. 
      if rowNr >= 1: 
       #g.seek(0) <-- makes it freeze on start up 
       Variables.append(row[0]) 
       Values.append(row[1]) 

      # Increase the row number 
      rowNr = rowNr + 1 

    if x == 'xf': 
     x = float(Values[0]) 

    return x 

xf = getval('xf') 
Rmin = xf*2.5   # Multiplies xf by 2.5 

xl = np.linspace(0,1,2) 
yl = [xf, Rmin] 

def GUI_MT(): 
    plt.plot(xl, yl, label='Test') 
    plt.xlabel('xA') 
    plt.ylabel('yA') 
    plt.xlim([0, 1]) 
    plt.ylim([0, Rmin*1.5]) 
    plt.legend() 
    plt.savefig('TestMT.png') 
    plt.show() 

def Pre_Output(): 
    print(' ') 
    print('New Run') 
    GUI_MT() 
    print('xf (fromEqm) = ', xf) 
    print('Rmin (fromEqm) = ', Rmin) 

def Outputs(x): 

    a = Rmin 

    if x == 'Rmin': 
     x = a 

    return x 

if __name__ == '__main__': 
    print('Run GUI instead')  
    print('xf = ', xf) 
    print('Rmin = ', Rmin) 
+0

これらのグローバル変数「値」と「変数」は避けるべきです。そして、あなたはいつも '' Values [0] ''にアクセスしています - その関数を再度実行すると決して別の結果を得ることはできません。 –

+0

計算ファイルにアクセスしました。私が知っている.csvファイルを介して入力値にアクセスしました。私はそれを開いてその値を変更するので更新しています –

+0

また、古い値を置き換えるように行0に戻ってきます –

答えて

2

test1Eqm.pyだけそれが最初にインポートするCSVファイルを読み込みます。もう一度読み込んでもコードが実行されることはありません。既存のモジュールへの別の参照を取得するだけです。基本的に、すべてのコードは、計算を実行するときに実際に呼び出す関数の内部にある必要があります。

また、1つのプログラム内でCSVファイルを使用して1つのモジュールから別のモジュールにデータを転送することはまったく問題です。データをパラメータとして渡してください!

+0

私はモジュールをアンインポートできますか?明らかに 'del test1Eqm'を使っているのはうまくいきません。 .csvの理由は、エントリーボックスを参照するときに「自己」を使用するのが難しく、さらに評価するために値に簡単にアクセスできるようにすることです。 –

+0

はい、モジュールをインポートします。私はそれが何であるかを伝えることを心配するつもりはありません。なぜなら、それが問題に対する最悪の解決策であるからです。完全に虚偽の理由でCSVからデータをインポートすることを主張しようとしている場合は、そうするコードを関数に入れ、インポート後にその関数を呼び出すだけです。 – jasonharper

+0

最終的なアプリは、値をエクスポートして.csvを上回ることができる教育ツールです。ご協力ありがとうございました –