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

标签 python-2.7 user-interface tkinter

我正在尝试编写一个简单的 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/

相关文章:

php - MySQL 表单的前端(Windows 或 OSX)

python - tkinter Canvas 图像未在类里面显示

python - 在 odoo 10 中创建新对象后如何调用我的方法?

Python ZIP 函数给出了意外的输出

android - 在哪里可以找到微调轮教程?

javascript - jQuery 对话框中的箭头

python - 一键阻止打开多个窗口

python - 一次只允许用户选择一个复选按钮?

python 2.7 : How to constrain the delimiter of a new line to be '\n' on Windows?

python - 将 PyInstaller 与 Bokeh 和 CustomJS 结合使用