如何在tkinter GUI中将函数返回值分配给类变量?

时间:2019-01-10 22:32:15

标签: python python-3.x tkinter

我正在Python3中使用tkinter编写一个简单的GUI。它允许用户按下一个调用函数select_files的按钮,该函数使用户可以选择一堆文件。该函数处理文件并输出需要分配给类变量(例如,a,b,c)的三个元素的元组,以进行进一步处理。我在类中定义的任何函数都应该可以访问这些变量。

我尝试了以下操作,但出现name 'self' is not defined错误。函数select_files已经定义并写在单独的.py文件中,我正在从正确的位置导入它。一般来说,我对GUI编程和面向对象的编程还比较陌生。

我研究了一个类似的问题,在这里问:python tkinter return value from function used in command,这总体上很有帮助,但无法解决我的特定问题。

这些self.aself.bself.c变量是否应出现在__init__()方法下?如果是这样,如何将它们分配给select_files函数的返回值?另外,这是否会使功能open_files变得不必要?

from ... import select_files
import tkinter as tk
from tkinter import filedialog

class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.run_button()

    def open_files(self):
        self.a, self.b, self.c = select_files()

    print(self.a) #self is not defined error comes from here

    def run_button(self):
        self.button = tk.Button(root, text = 'run', command = self.open_files)
        self.button.pack()

if __name__ == "__main__":
    root = tk.Tk()
    MainApplication(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

编辑:基于rassar的评论,我进行了以下更改,并且可以正常运行。用户可以按“打印”按钮,然后对象被打印。现在有人可以解释为什么self.run_button()self.print_button()需要使用init方法吗?

class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.run_button()
        self.print_button()

    def open_files(self):
        self.a, self.b, self.c = select_files()

    def print_files(self):
        print(self.a)

    def run_button(self):
        self.button = tk.Button(root, text = 'run', command = self.open_files)
        self.button.pack()

    def print_button(self):
        self.button = tk.Button(root, text = 'print', command = self.print_files)
        self.button.pack()

if __name__ == "__main__":
    root = tk.Tk()
    MainApplication(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

0 个答案:

没有答案