Tkinter GUI使用单独的Python文件和函数实现

Tkinter GUI使用单独的Python文件和函数实现,python,pandas,tkinter,pygui,Python,Pandas,Tkinter,Pygui,我有一个GUI界面的问题,需要通过第二个文件来实现,该文件只包含要读取的文件、绘制的图和一些基于该文件的新函数 我正在尝试使用Tkinter创建GUI应用程序。我的做法如下。我有一个后台脚本(比如background.py),它有两个函数。函数X加载一个数据文件,进行一些计算并输出一个图形。我想触发它的方式是通过另一个文件(GUI.py)中的GUI脚本,该脚本打开一个带有按钮的面板,当我单击按钮时,应该计算文件Background.py中的函数X,并显示一个绘图。检查绘图后,我可以点击另一个按钮

我有一个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)

Background.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
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.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
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的输出,我将如何确保在后台调用proram Y


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

我假设
progA
=
progX
,和
progB
=
progY

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

在GUI中创建您的输入框:

e1 = Entry(panel1)
e2 = Entry(panel1)
e3 = Entry(panel1)
self.entries = (e1, e2, e3)
for e in self.entries:
    e.pack()
def get_entries_call_y(self):
    e = [x.get() for x in self.entries]
    bd.progY(e[0], e[1], e[2])
制作一个函数,在GUI中获取值并调用
progY

e1 = Entry(panel1)
e2 = Entry(panel1)
e3 = Entry(panel1)
self.entries = (e1, e2, e3)
for e in self.entries:
    e.pack()
def get_entries_call_y(self):
    e = [x.get() for x in self.entries]
    bd.progY(e[0], e[1], e[2])
将按钮绑定到
get\u entries\u call\u y
(而不是
bd.progY
):

如果您希望获得关于构造GUI程序的一般建议,请尝试(尽可能)遵循标准用户界面体系结构,如model view controller()。我上面描述的解决方案应该可以让您的程序正常工作,但是您构建程序的方式并不是一个很好的方式,原因有很多。学习MVC将帮助您组织哪些任务应该放入哪些函数/类/文件中,为您提供一个添加功能和改进代码的逻辑框架,并允许您更高效地创建新的GUI程序


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

你的Background.py正确吗?我认为您在
plt.boxplot(df['col])
上缺少
。是的,Black Thunder您是正确的。我更新了。但这不是问题所在。我的问题更深。谢谢,谁能回答这个问题。即使是一些基本的帮助也可能是有益的。只是为了确保您知道,在关闭GUI之前,mainloop之后的代码永远不会运行。是的。。我想问一下我是不是要去正确的方向太好了。。非常感谢,洛顿先生。我会仔细检查,重组,并随时通知你。