Tkinter GUI使用单独的Python文件和函数实现
我有一个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.pyTkinter GUI使用单独的Python文件和函数实现,python,pandas,tkinter,pygui,Python,Pandas,Tkinter,Pygui,我有一个GUI界面的问题,需要通过第二个文件来实现,该文件只包含要读取的文件、绘制的图和一些基于该文件的新函数 我正在尝试使用Tkinter创建GUI应用程序。我的做法如下。我有一个后台脚本(比如background.py),它有两个函数。函数X加载一个数据文件,进行一些计算并输出一个图形。我想触发它的方式是通过另一个文件(GUI.py)中的GUI脚本,该脚本打开一个带有按钮的面板,当我单击按钮时,应该计算文件Background.py中的函数X,并显示一个绘图。检查绘图后,我可以点击另一个按钮
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之后的代码永远不会运行。是的。。我想问一下我是不是要去正确的方向太好了。。非常感谢,洛顿先生。我会仔细检查,重组,并随时通知你。