python2 中tkinter 打开文件 中文乱码

这个程序的目的是写一个文件树软件,通过“打开”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()

2个回答

UnicodeDecodeError:
中文默认是gbk编码
解码错误 读取文件是需要指定编码是utf8 多次打开或者多次调用需要多次指定编码是utf8
dirs.insert(END,eachFile.decode("gbk").encode("utf-8"))

不用解码直接编码utf8

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题

2
Python使用tkinter实时动态显示图像闪烁问题?
1
python使用tkinter调用新窗口,被调用的窗口点击右上角关闭按钮会报错,怎么屏蔽按钮
1
python tkinter lable 循环显示的问题
2
Python中用tkinter创建GUI时,设置窗口大小,总是报错,求各位大神指导!
0
python3 tkinter Entry组件获取输入内容,通过button组件运行失败
1
python 关于tkinter.Tk().geometry("widthxheight+x+y")参数问题的深入提问。
1
exe文件运行时报错 platform plugin问题
1
Python tkinter编程中,点击按钮怎么获取Text的内容
0
python的tkinter中的variable封装成类后调用无效?
1
Python_tkinter关于主窗口和弹窗的控件的显示
1
一个关于python tkinter中text与Botton的问题
1
python tkinter,怎么让控件显示在Frame中呢?
0
Python tkinter图形界面BUTTON事件控制和编辑框返回值出现异常
0
Python tkinter图形界面BUTTON时间控制和编辑框返回值出现异常?
1
一个小白求教如何使用Tkinter导入图片
1
python tkinter里面,我怎么把函数执行的结果显示(print)到创建的Text里面?
1
python tkinter里面,怎么把函数的结果按照函数原本的样式输出到text框上面?
1
请教:Python Entry文本框中显示数字0,怎么才能让它显示空文本框?
0
tkinter中label需要显示的内容太多时,如果文字内容超过了label的大小那么内容就会被截断,导致显示不完全
0
tkinter 双击 打开文件