Python - Tkinter GUI 更新多个模块



提前感谢您的任何帮助。

我有 2 个.py文件,一个运行 GUI,另一个进行基本计算并使用 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)

test1Eqm.py 仅在最初导入 CSV 文件时读取该文件。 再次导入它不会导致执行任何代码,您只会获得对现有模块的另一个引用。 基本上,它的所有代码都需要位于您希望执行计算时实际调用的函数中。

此外,在单个程序中使用 CSV 文件将数据从一个模块传输到另一个模块是完全疯狂的。 将数据作为参数传递!

最新更新