王喜兴喝橙汁 2019-07-30 00:40 采纳率: 0%
浏览 927

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条回答

  • zqbnqsdsmd 2019-07-30 10:17
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示