最近在用python写一些简单的脚本,需要打开某个文件读取一些信息,这个文件由User来决定。所以并不确定User会使用的path以及file name。所以想尝试用Windows内置浏览窗口,来获取对应的路径,在度娘上找到一些例子可以做到。

在IDLE上尝试了以下的sample code,发现就是我想要的效果。

>>> from tkinter.filedialog import askopenfilename
>>>
>>> import tkinter as tk
>>> root = tk.Tk()#创建一个Tk的对象,会弹出一个窗口
>>> root.withdraw()#将窗口隐藏
''
>>> file_path = askopenfilename()
>>> print(file_path)
D:/桌面/20180514产品定价表.csv

但是实际想在pycharm尝试的时候,发现了一些问题(问题点与上述的tkinter没有多大关系,主要是import相关)。

import tkinter

root = tkinter.Tk()
root.withdraw()
file_path = askopenfilename()
product_list = get_data('D:\\桌面\\20180514产品定价表.csv')

本来想着使用如上的方式,直接将tkinter模块全部导入,这样使用,却发现askopenfilename()这里会有Error info,提示'sdkopenfilename' is not defined。到这里我就很奇怪了,askopenfilename不是tkinter模块下面filedialog内容的一部分么?如果我导入了tkinter的话,按理说应该整个导入的,不应该会存在未定义的情况!

我以为是我import的方式有问题,如果要导入模块内所有内容是否应该这样?

from tkinter import *

我的软件里面不单单导入了tkinter还有re模块,想尝试用来做精炼用的,但是上面的import语句一写,import re的语句就变成灰色了,显示的信息“This inspection detect name that should be resolve but don't.Due to dynamic dispatch and duck typing.This is possible in a limited but useful number of cases.Top-level and class-level items are supported better than instance items.”

这意思是无法正常导入re?但是非常不合理,如果没有导入tkinter的时候,re的导入是完全没有问题的。

所以为什么会出现上述的问题呢?

而且,在尝试使用from tkinter import *之后,下部分tkinter.Tk()显示‘tkinter is not defined'此时我就彻底懵了!

按照pycharm Error提示信息去解决问题,必须要import tkinter这样的语句,tkinter才会正常,而askopenfilename()必须要按照from tkinter.filedialog import askopenfilename的方式定义才能正确导入sdkopenfilename.

有点强迫症的我实在接受不了要导入两次tkinter模块里面的内容。

为了解决这个问题,找了一些关于import的资料,发现自己对于import的基础理解不够清晰。tkinter这并不是一个模块,应该是一个包,而askopenfilename是在tkinter包下的filedialog模块里面的类,所以如果要使用askopenfilename的话,就必须要将对应的filedialog模块导入,导入的时候需要声明是在什么包下,所以要写成:from tkinter.filedialog import sdkopenfilename的形式。

问题现在还没找到答案,是否有人明白的可以解释一下?我这边先做个记录,后面找到答案之后再回来update.