Python 2.7 在tkinter GUI中传递变量的正确方法
我正在尝试编写一个简单的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
csv
文件中绘制数据,我将该文件读入pandasDataFrame
。我是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编程背景,使用全局变量的想法让我想哭^完美,这正是我所需要的-用一个示例进行清楚的解释。谢谢很好,这正是我所需要的——用一个例子进行清楚的解释。谢谢