我是tkinter的新手,我想读一个文件。这个简单的操作结果证明是非平凡的。这是我的代码:
import tkinter as tk
from matplotlib.backends.backend_tkagg \
import FigureCanvasTkAgg ### PROBLEM 1: REMOVING THIS IMPORT CAUSES AN
### ERROR WHEN OPENING THE DIALOG
def op():
global filename
filename = tk.filedialog.askopenfilename()
root = tk.Tk()
mainframe = tk.Frame(root)
mainframe.grid(column=0, row=0)
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)
tk.Button(mainframe, text="Open file", command=op).grid(column=0, row=1)
#print(filename) ### PROBLEM 2: UNCOMMENTING THIS CAUSES AN ERROR
### UNLESS I ADD <filename = ""> ABOVE THE op
### FUNCTION DEFINITION
root.mainloop()
问题:
1)导入完全不同的包matplotlib似乎非常奇怪,实际上对我的程序是否有效有影响。如果没有导入,单击打开按钮会导致错误。有了它,它工作正常 这可能是个错误吗?
2)为什么filename
无法在函数体外访问,即使我将其声明为全局?一个与我的tkinter代码具有相同结构的最小工作示例就是这个 - 这可行:
def test():
global testname
testname = 23
def call_test():
test()
call_test()
print(testname)
奇怪的是,如果我在顶部插入filename = ""
,我可以让我的tkinter代码不会产生错误 - 但我仍然无法打印出文件名,只是错误消失了。
3)是否还有其他更优雅的方式来访问我正在打开的文件的路径而不使用全局变量?什么是最佳做法?
答案 0 :(得分:1)
我认为调用matplotlib “......这是一个完全不同的软件包......”,更不用说调用backend_tkagg
了。在内部,第二个导入也导入filedialog
。这就是你不需要它的原因。您只需使用以下命令替换第二个导入:
import tkinter.filedialog
当时:
print(filename)
执行filename
只是不存在,因为之前从未调用op
。 Python没有被编译,它被解释,它只是跳过运行时错误,直到导致它的行运行。尝试:
op()
print(filename)
看到差异。
您的文件路径阅读器 有效。只是你在print
开始存在之前或者在其中有一个路径之前尝试filepath
。
我认为上下文中的另一种方式是:
...
def op():
global root
root.filename = tk.filedialog.askopenfilename()
print(root.filename)