Python全局/本地数据来自文件对话框

时间:2015-08-03 03:15:52

标签: python tkinter

我正在学习python作为一种消遣,并且在从函数访问数据("行")时遇到了一些麻烦。 我希望创建一个标签来显示函数后面的行数,但是我收到的错误是变量是"未定义"。 为什么会这样?

__author__ = 'alasdair'
from Tkinter import *
from tkMessageBox import *
import sys, Tkinter

from tkFileDialog import askopenfilename
Mainwindow = Tk()
Mainwindow.title ("Test")
Mainwindow.geometry('600x400')
global lines

def openfile():
 name = askopenfilename(filetypes=(("TextDocument", "*.TXT;*.txt"),
                                           ("All files", "*.*") ))
 with open(name) as foo:
  lines = len(foo.readlines())

openfile = Button(Mainwindow,text = "Open File",width=20,command = openfile).place(x=25,y=45)
print(lines)
Mainwindow.mainloop()

2 个答案:

答案 0 :(得分:0)

openfile()变量仅在函数 - openfile中定义,并且是它的局部变量,您不能在函数外部访问它(除非您在函数开头将其声明为全局变量)功能,虽然我不建议这样做。)

此外,text = "Open File"是具有print(lines)的Button的回调函数,并且在单击按钮的情况下不会调用该函数。

但是在创建Button之后立即执行print(lines),无法保证在到达print(lines)之前点击该按钮。

您应该删除def openfile(): name = askopenfilename(filetypes=(("TextDocument", "*.TXT;*.txt"), ("All files", "*.*") )) with open(name) as foo: lines = len(foo.readlines() print(lines) 行,并将其打印在函数 -

{{1}}

答案 1 :(得分:0)

您可以做的是从打开的文件中返回行,然后将其分配给如下变量:

def openfile():
     name = askopenfilename(filetypes=(("TextDocument", "*.TXT;*.txt"),
                                       ("All files", "*.*") ))
 with open(name) as foo:
     lines = len(foo.readlines())
    return lines

lines = openfile() # run before you tried to access the lines variable

您可能需要考虑的其他事项:

  • 将文件名作为参数传递给openfile()
  • 不使用与函数名称相同的变量名称