Python 2.7 在tkinter GUI中传递变量的正确方法

Python 2.7 在tkinter GUI中传递变量的正确方法,python-2.7,user-interface,tkinter,Python 2.7,User Interface,Tkinter,我正在尝试编写一个简单的GUI来从csv文件中绘制数据,我将该文件读入pandasDataFrame。我是GUI编程的新手,我很难理解Tkinter之类的事件驱动设置 作为一个简单的练习,我想设置两个按钮,一个用于打开文件并读取数据帧,另一个用于打印生成的数据帧。我第一次天真的尝试没有成功: import pandas as pd import tkFileDialog import Tkinter as tk def open_events_db(): file_path_strin

我正在尝试编写一个简单的GUI来从
csv
文件中绘制数据,我将该文件读入pandas
DataFrame
。我是GUI编程的新手,我很难理解Tkinter之类的事件驱动设置

作为一个简单的练习,我想设置两个按钮,一个用于打开文件并读取
数据帧
,另一个用于打印生成的
数据帧
。我第一次天真的尝试没有成功:

import pandas as pd
import tkFileDialog
import Tkinter as tk

def open_events_db():
    file_path_string = tkFileDialog.askopenfilename()
    eventsdb = pd.read_csv(file_path_string,encoding='utf-8')
    return eventsdb

def print_events_db(eventsdb):
    print eventsdb

def main():
    root=tk.Tk()
    eventsdb = tk.Button(text='File Open', command=open_events_db).pack(fill=tk.X)
    tk.Button(text='Print DB', command=lambda:print_events_db(eventsdb)).pack(fill=tk.X)
    tk.mainloop()


if __name__=="__main__":
    main()
我可以很好地读入文件并打开它,但事后看来,显然我无法从文件打开按钮返回
eventsdb
,并将其作为打印按钮的参数


不过,我不认为让按钮在该数据库上运行是不合理的,那么在GUI中传递变量的正确方式是什么呢?

从按钮和事件处理程序调用的函数不会返回它们的数据。相反,它们必须设置全局变量或类属性

def open_events_db():
    global eventsdb
    file_path_string = tkFileDialog.askopenfilename()
    eventsdb = pd.read_csv(file_path_string,encoding='utf-8')

def print_events_db():
    global eventsdb
    print eventsdb

...
tk.Button(text='Print DB', command=print_events_db).pack(fill=tk.X)
依赖全局变量通常被认为是糟糕的编程。由于python是一种面向对象的语言,所以将应用程序作为类编写是有意义的。然后使用实例属性而不是全局变量

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        open_button = tk.Button(text='File Open', command=self.open_events_db)
        print_button = tk.Button(text='Print DB', command=self.print_events_db)

        open_button.pack(fill=tk.X)
        print_button.pack(fill=tk.X)

    def open_events_db(self):
        file_path_string = tkFileDialog.askopenfilename()
        self.eventsdb = pd.read_csv(file_path_string,encoding='utf-8')

    def print_events_db():
        print self.eventsdb

def main():
    root=tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

if __name__=="__main__":
    main()

从按钮和事件处理程序调用的函数不会返回其数据。相反,它们必须设置全局变量或类属性

def open_events_db():
    global eventsdb
    file_path_string = tkFileDialog.askopenfilename()
    eventsdb = pd.read_csv(file_path_string,encoding='utf-8')

def print_events_db():
    global eventsdb
    print eventsdb

...
tk.Button(text='Print DB', command=print_events_db).pack(fill=tk.X)
依赖全局变量通常被认为是糟糕的编程。由于python是一种面向对象的语言,所以将应用程序作为类编写是有意义的。然后使用实例属性而不是全局变量

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        open_button = tk.Button(text='File Open', command=self.open_events_db)
        print_button = tk.Button(text='Print DB', command=self.print_events_db)

        open_button.pack(fill=tk.X)
        print_button.pack(fill=tk.X)

    def open_events_db(self):
        file_path_string = tkFileDialog.askopenfilename()
        self.eventsdb = pd.read_csv(file_path_string,encoding='utf-8')

    def print_events_db():
        print self.eventsdb

def main():
    root=tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

if __name__=="__main__":
    main()

eventsdb
None
,因为它是由
pack
返回的,而不是命令的结果。使用
全局
变量或dict或UI本身的成员变量来存储它。来自C编程背景,使用全局变量的想法让我想哭^ ^ ^
事件DB
,因为它是
返回的,而不是命令的结果。使用
全局
变量或dict或UI本身的成员变量来存储它。来自C编程背景,使用全局变量的想法让我想哭^完美,这正是我所需要的-用一个示例进行清楚的解释。谢谢很好,这正是我所需要的——用一个例子进行清楚的解释。谢谢