我从python开始,我已经用var2 = locals().get('var', factory())
创建了一个很好的绘图功能。现在我想使用tkinter将函数插入到GUI中。
正如我从youtube和这个论坛中学到的,我应该使用课程。
不幸的是我有一些问题。到目前为止我所拥有的内容(我不了解所有细节)是:
matplotlib
该程序有两个页面(因为我想使用不同的绘图仪)和一个可以从目录中打开文件的菜单。
import tkinter as tk
from tkinter import filedialog
LARGE_FONT=('Verdana',12)
class XPSPlotApp(tk.Tk):
def __init__(self, *args,**kwargs):
tk.Tk.__init__(self, *args,**kwargs)
container=tk.Frame(self)
container.pack(side='top',fill='both',expand=True)
container.grid_rowconfigure(0,weight=1)#0 is min size
container.grid_columnconfigure(0,weight=1)
#adding a menubar#
self.menuBar = tk.Menu(master=self)
self.filemenu = tk.Menu(self.menuBar, tearoff=0)
self.filemenu.add_command(label="Open", command=self.browse_file)
self.filemenu.add_command(label="Quit!", command=self.quit)
self.menuBar.add_cascade(label="File", menu=self.filemenu)
self.config(menu=self.menuBar)
self.frames={}
for F in (HRXPSPlotter, SurveyXPSPlotter):
frame=F(container,self)
self.frames[F]=frame
frame.grid(row=0,column=1,sticky='nsew')
self.show_frame(HRXPSPlotter)
def show_frame(self, cont):
frame=self.frames[cont]
frame.tkraise()
#Question if it should be here because maybe overwrites the filename form other window?
def browse_file(self):
self.filename = filedialog.askopenfilename(initialdir = "E:/Images",title = "choose your file",filetypes = (("txt files","*.txt"),("all files","*.*")))
print(self.filename)
def printFN(self):
print(self.filename)
class HRXPSPlotter(tk.Frame):
def __init__(self,parent, controller):
tk.Frame.__init__(self,parent)
lable=tk.Label(self,text='Sart Page',font=LARGE_FONT)
lable.pack(pady=10,padx=10)
#button to go to another page
button1=tk.Button(self, text='Visit Page 1',command=lambda:controller.show_frame(SurveyXPSPlotter))
button1.pack()
class SurveyXPSPlotter(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
lable=tk.Label(self,text='Page One',font=LARGE_FONT)
lable.pack(pady=10,padx=10)
button1=tk.Button(self, text='Back to Page 1',command=lambda:controller.show_frame(HRXPSPlotter))
button1.pack()
app=XPSPlotApp()
app.mainloop()
+ filename
,但我不能让它工作?问题很简单,我真的不知道我在哪里定义函数 - 在filepath
或子类中?而且...... __init__
如何运作,对我来说仍然是神奇的!command=lambda:controller
的子类(例如pageOne
)方法与tk.Frame
的{{1}}类似{/ 1}}?答案 0 :(得分:0)
我不会直接解决你的所有三个子问题,因为它会在tkinter
上成为一个完整的小型教程。但是,我可以向您展示如何添加Button
来进行绘图。请特别注意其上带有 # ADDED
注释的行。
在代码的修改版本下面添加了一些内容,显示了放置绘图函数函数的位置和方式。我也改变了编码风格,使其更紧密地跟随PEP 8 - Style Guide for Python Code并且更具可读性。
在几个地方,我还更改了变量的名称,以便更清楚地了解基于tkinter
的这种gui架构是如何运作的。
import tkinter as tk
from tkinter import filedialog
LARGE_FONT=('Verdana', 12)
class XPSPlotApp(tk.Tk):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
container = tk.Frame(self)
container.pack(side='top', fill='both', expand=True)
container.grid_rowconfigure(0, weight=1) # 0 is min size
container.grid_columnconfigure(0, weight=1)
# Add menubar and subcommands.
self.menuBar = tk.Menu(master=self)
self.filemenu = tk.Menu(self.menuBar, tearoff=0)
self.filemenu.add_command(label="Open", command=self.browse_file)
self.filemenu.add_command(label="Plot", command=self.plot_file) # ADDED
self.filemenu.add_command(label="Quit!", command=self.quit)
self.menuBar.add_cascade(label="File", menu=self.filemenu)
self.config(menu=self.menuBar)
self.frames={}
for FrameSubclass in (HRXPSPlotter, SurveyXPSPlotter):
frame = FrameSubclass(container, self) # create class instance.
self.frames[FrameSubclass] = frame
frame.grid(row=0, column=1, sticky='nsew')
self.show_frame(HRXPSPlotter)
def show_frame(self, subclass):
frame = self.frames[subclass]
frame.tkraise()
def browse_file(self):
self.filename = filedialog.askopenfilename(
initialdir="E:/Images", title="Choose your file",
filetypes=(("text files", "*.txt"), ("all files", "*.*"))
)
print(self.filename)
def plot_file(self): # ADDED
try:
print('Plotting:', self.filename)
except AttributeError:
print('No filename has been selected to plot!')
class HRXPSPlotter(tk.Frame):
def __init__(self, parent, controller):
super().__init__(parent)
label = tk.Label(self, text='Start Page', font=LARGE_FONT)
label.pack(pady=10, padx=10)
# Button to go to another page.
button1 = tk.Button(self, text='Visit Page 1',
command=lambda: controller.show_frame(SurveyXPSPlotter))
button1.pack()
class SurveyXPSPlotter(tk.Frame):
def __init__(self, parent, controller):
super().__init__(parent)
label = tk.Label(self, text='Page One', font=LARGE_FONT)
label.pack(pady=10, padx=10)
# Button to go to another page.
button1 = tk.Button(self, text='Back to Page 1',
command=lambda: controller.show_frame(HRXPSPlotter))
button1.pack()
app=XPSPlotApp()
app.mainloop()
用于构造command=lambda: controller.show_frame(<tk.Frame subclass>)
的{{1}}参数创建了一个匿名函数,当按下相应的按钮时调用tk.Buttons
(与controller.show_frame(<tk.Frame subclass>)
本身相反)已创建)。
Button
函数在show_frame()
类{{1}中创建的Frame
字典中查找self.frames
子类实例方法和“提升”它使它成为显示的最顶部框架(它有效地隐藏了所有其他的大小相同但位于相同位置但现在“低于”它)。