0

我在通过第二个文件实现 GUI 界面时遇到问题,该文件仅包含要读取的文件、制作的图和一些要基于该文件评估的新功能。

我正在尝试使用 Tkinter 创建一个 GUI 应用程序。我的做法如下。我有一个后台脚本(比如 Background.py),它有两个功能。函数 X 加载一个数据文件,进行一些计算并输出一个图形。我想触发它​​的方式是通过另一个文件(GUI.py)中的GUI脚本打开一个带有按钮的面板,当我单击该按钮时,应该评估文件Background.py中的函数X并应该显示一个绘图. 一旦我检查了绘图,我可以点击另一个按钮来关闭绘图并终止函数 X。现在我可以选择点击另一个按钮来触发文件 Background.py 中的函数 Y。这些按钮应该允许我输入三个值,这应该是文件 Background.py 中函数 Y 的输入。一旦我按下这个按钮,它应该触发函数 Y 并执行它要求它执行的操作。现在最后,之后我可以点击按钮关闭 gui。

我怎样才能做到这一点?。一般粗略的想法会有所帮助。

我已经尽可能多地举了一个例子:(至少是代码的骨架)我有一个背景文件说(Background.py)和gui文件(说GUI.py)

背景.py

import numpy

import matplotlib.pyplot as plt

import pandas

def progX():
     df = pd.read (myfile)

     ##df.stats # doing something and generating a plot from the file

    plt.boxplot(df['col'])

    plt.show()



def progY(y1, y2,y3):

    ## get the y1, y2, y3 from the GUI interface which the user has entered 

    #run a code...  and generate an output file

图形用户界面.py

import Background as bg   
from tkinter import *
from tkinter.ttk import *

class GUI ():

    def create widgets(self):
        #....

    def create_panel2(self):
        #create buttons
        panel1 = ...
        btn1 = Button(panel1, text="yyyyy", command=bg.progA)
        btn1.pack() 

    def create_panel2(self):
        #create buttons
        panel2 = ...
        btn2 = Button(panel1, text="yyyyy", command=bg.progB)
        btn2.pack() 

All_Entries = []

window = Tk()
D=GUI(window)
window.mainloop()
runprogram1 = bg.progX()
runprogram2 = bg.probY(x, y, z)

我现在的问题是,以上是否有意义?如何从 GUI 调用后台函数?语句 runprogram1 & runprogram2 绝对不正确,我该如何实现。另外,一旦我关闭了程序 X 的输出,我将如何确保在后台调用程序 Y?

我想这些问题是有道理的。我是 GUI 新手,很难解决这个问题,我需要这样做。任何帮助将不胜感激。

4

1 回答 1

1

我假设progA==progXprogB== progY

由于您的代码当前是结构化的,GUI 中的某些功能需要从小部件(Entry()大概是 )获取 y1、y2 和 y3,并传递给progY. progY无法获取该信息,b/c progY 不知道 GUI 中的小部件。通过将按钮绑定到另一个函数来获取 GUI 类中的这些值,该函数 1).get()Entry()小部件上调用,然后 2) 将这些值传递给 progY。

在 GUI 中创建您的输入框:

e1 = Entry(panel1)
e2 = Entry(panel1)
e3 = Entry(panel1)
self.entries = (e1, e2, e3)
for e in self.entries:
    e.pack()

progY创建一个在 GUI中获取值和调用的函数:

def get_entries_call_y(self):
    e = [x.get() for x in self.entries]
    bd.progY(e[0], e[1], e[2])

将您的按钮绑定到get_entries_call_y(而不是bd.progY):

btn2 = Button(panel1, text="yyyyy", command=get_entries_call_y)

如果您想获得有关构建 GUI 程序的一般建议,请尝试(尽可能)遵循标准用户界面架构,如模型视图控制器(https://en.wikipedia.org/wiki/Model-view -控制器)。我上面描述的解决方案应该可以使您的程序正常工作,但是由于很多原因,您构建程序的方式并不是真正的好方法。学习 MVC 将帮助您组织应将哪些任务放入哪些函数/类/文件中,为您提供添加功能和改进代码的逻辑框架,并允许您更有效地创建新的 GUI 程序。

或者至少这就是我从学习 MVC 中得到的。

于 2018-10-19T22:03:21.857 回答