我正在尝试编写一个简单的 GUI 来绘制 csv
文件中的数据,我将其读入 pandas DataFrame
中。我对 GUI 编程完全陌生,并且很难理解像 Tkinter 这样的事件驱动设置。
作为一个简单的练习,我想设置几个按钮,一个用于打开文件并读取 DataFrame
,另一个用于打印生成的 DataFrame
>。我的第一次天真的尝试没有成功:
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()
关于python-2.7 - 在 tkinter GUI 中传递变量的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32482745/