我正在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.a
,self.b
,self.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()