这个程序的目的是写一个文件树软件,通过“打开”button 打开地址对话框,选择文件夹。如果是文件夹 双击则继续打开 如果是文件 双击则打开文件。
(双击打开文件还没写)
现在打开文件夹之后 很多地方显示乱码,而且打开某一个文件并不是马上显示出文件夹中所有文件,需要点进去再退回来才能显示。
现在程序应该有不少错误,一点点改吧。
首先请问大神 怎么解决中文乱码问题?
在运行的时候提示这种错误语言:
Traceback (most recent call last):
File "D:\Python27\lib\lib-tk\Tkinter.py", line 1547, in call
return self.func(*args)
File "d:\Untitled-1.py", line 28, in setDirAndGo
doLS()
File "d:\Untitled-1.py", line 52, in doLS
cwd.set(os.getcwd()+'\'+tdir)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 3: ordinal not in range(128)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
from time import sleep
from Tkinter import *
import tkFileDialog #弹出选择路径的库
import tkMessageBox
import fnmatch #选择文件的关键词
def dakai():
dirs.delete(0,END)
default_dir = r"C:\Users\lenovo\Desktop" # 设置默认打开目录
path = tkFileDialog.askdirectory(title=u"选择文件",
initialdir=(os.path.expanduser(default_dir)))
doLS1(path)
#双击时调用,双击时,设置背景色为红色,并调用doLS函数打开所选文件
def setDirAndGo(ev=None):
last = cwd.get()
dirs.config(selectbackground='red')
check = dirs.get(dirs.curselection())
if not check:
check = os.curdir
cwd.set(check)
doLS()
#实现更新目录的核心函数
def doLS(ev=None):
error = ''
tdir = cwd.get()
if not tdir:tdir=os.curdir
#若路径输入错误,或者打开的是文件,而不是目录,则更新错误提示信息
if not os.path.exists(tdir):
error = os.getcwd()+'\\'+tdir + ':未找到文件'
elif not os.path.isdir(tdir):
error = os.getcwd()+'\\'+tdir + ':未找到目录'
if error:
cwd.set(error)
top2.update()
sleep(1)
if not (last):
last = os.curdir
cwd.set(os.curdir)
dirs.config(selectbackground='LightSkyBlue')
dirn.config(text=os.getcwd()+'\\'+tdir)
top2.update()
return
cwd.set(os.getcwd()+'\\'+tdir)
top2.update()
dirlist = os.listdir(tdir)#os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。
dirlist.sort()
os.chdir(tdir)#os.chdir() 方法用于改变当前工作目录到指定的路径。
#更新界面上方标签内容
dirl.config(text=os.getcwd().decode("gbk").encode("utf-8"))
top2.update()
dirs.delete(0,END)
dirs.insert(END,os.pardir)#os.chdir(os.pardir) 切换到上级目录 即将上级目录.. 插入到dirs对象中
#把选定目录的文件或文件夹的名字的列表依次插入到dirs对象中
for eachFile in dirlist:
dirs.insert(END,eachFile.decode("gbk").encode("utf-8")) #先解码 再编码 bingo!
cwd.set(os.curdir)
dirs.config(selectbackground='LightSkyBlue')
def doLS1(path):
error = ''
tdir = path
if not tdir:tdir=os.curdir
#若路径输入错误,或者打开的是文件,而不是目录,则更新错误提示信息
if not os.path.exists(tdir):
error = os.getcwd()+'\\'+tdir + ':未找到文件'
elif not os.path.isdir(tdir):
error = os.getcwd()+'\\'+tdir + ':未找到目录'
if error:
cwd.set(error)
top2.update()
sleep(1)
if not (last):
last = os.curdir
cwd.set(os.curdir)
dirs.config(selectbackground='LightSkyBlue')
dirn.config(text=os.getcwd()+'\\'+tdir)
top2.update()
return
cwd.set(os.getcwd()+'\\'+tdir)
top2.update()
dirlist = os.listdir(tdir)#os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。
dirlist.sort()
os.chdir(tdir)#os.chdir() 方法用于改变当前工作目录到指定的路径。
#更新界面上方标签内容
dirl.config(text=os.getcwd().decode("gbk").encode("utf-8"))
top2.update()
dirs.delete(0,END)
dirs.insert(END,os.pardir)#os.chdir(os.pardir) 切换到上级目录 即将上级目录.. 插入到dirs对象中
#把选定目录的文件或文件夹的名字的列表依次插入到dirs对象中
for eachFile in dirlist:
dirs.insert(END,eachFile.decode("gbk").encode("utf-8"))
cwd.set(os.curdir)
dirs.config(selectbackground='LightSkyBlue')
top2 = Tk()
top2.title('营销集约管控中心-文件树')
cwd = StringVar(top2)
dirl = Label(top2,fg = 'blue')
dirl.pack()
dirfm = Frame(top2)
dirsb = Scrollbar(dirfm)
dirsb.pack(side=RIGHT,fill=Y)
dirs = Listbox(dirfm,height=15,width=50,yscrollcommand=dirsb.set)
#通过使用List的bind()方法,将鼠标双击事件绑定,并调用setDirAndGo函数
dirs.bind('<Double-1>',setDirAndGo)
# 下面实现单击时,将所选文件路径加名字更新到下方输入框控件中,不能用self.dirs.bind('<Button-1>', self.setDirn)绑定单击事件,会出错
#dirs.bind("<<ListboxSelect>>", setDirn)
dirsb.config(command=dirs.yview)
dirs.pack(side=LEFT,fill=BOTH)
dirfm.pack()
#第二个框架bfm,放置按钮
bfm = Frame(top2)
open = Button(bfm,text='打开',command=dakai,activeforeground='white',activebackground='blue')
open.pack(side=LEFT)
bfm.pack()
if __name__ =='__main__':
#设定初始目录为桌面
mainloop()