tkinter gui加载一个flie并可以打印出文件名

时间:2017-12-06 21:54:42

标签: python class user-interface tkinter

我从python开始,我已经用var2 = locals().get('var', factory()) 创建了一个很好的绘图功能。现在我想使用tkinter将函数插入到GUI中。 正如我从youtube和这个论坛中学到的,我应该使用课程。 不幸的是我有一些问题。到目前为止我所拥有的内容(我不了解所有细节)是:

matplotlib

该程序有两个页面(因为我想使用不同的绘图仪)和一个可以从目录中打开文件的菜单。

  1. 现在我想要实现一个函数,当我点击一个按钮时,它会绘制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或子类中?而且......
  2. __init__如何运作,对我来说仍然是神奇的!
  3. 为什么command=lambda:controller的子类(例如pageOne)方法与tk.Frame的{​​{1}}类似{/ 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子类实例方法和“提升”它使它成为显示的最顶部框架(它有效地隐藏了所有其他的大小相同但位于相同位置但现在“低于”它)。