tkinter主窗口和子窗口同时弹出该怎么办?

这是一个小程序:运行后主窗口打开。点击Click Me按钮,应该弹出一个文件夹选择窗口,选择好文件夹点击确认后,将文件夹中的文件(不包括隐藏文件和子文件夹)的名称前面加上序号。在按钮下面显示已处理的文件数量。

目前我的代码存在两个主要问题:
(1)主窗口和子窗口同时弹出了;
(2)未能筛选出隐藏文件(macos系统)。
希望能指点!谢谢!

import os  
from tkinter import filedialog  
import tkinter as tk  
from tkinter import Button  
  
class ReName():  
    def __init__(self):  
        self.n = 0  
  
  def rename(self):  
  
        file_path = filedialog.askdirectory(title='ReNamer')  
        file_lists = os.listdir(file_path)  
        for file in file_lists.copy():  
            oldname = file_path + os.sep + file  
            if os.path.isdir(oldname):  
                continue  
 else:  
                newname = file_path + os.sep + '(' + str(self.n + 1) + ')' + file  
                os.rename(oldname, newname)  
                self.n+=1  
  print(self.n)  
  
  
root=tk.Tk()  
root.geometry("550x200")  
label=tk.Label(root,font=("Arial Bold",15),  
               text='Please select a directory to rename files in the folder:')  
label.pack()  
ins=ReName()  
btn=Button(root,font=("Arial",15),bg='orange',text="Click Me",command=ins.rename())  
btn.pack()  
print(ins.n)  
label=tk.Label(root,text=str(ins.n)+' file(s) renamed.')  
label.pack()  
root.mainloop()
阅读 5.2k
1 个回答

参考代码注释

import os
from tkinter import filedialog
import tkinter as tk
from tkinter import Button


class ReName():
    def __init__(self):
        self.n = 0

    def shouldIgnore(self, path: str) -> bool:
        '''忽略以下路径:
        1. 文件夹。
        2. macOS 隐藏文件
           a. 文件名以 '.' 开头,如 ".git"。
           b. 文件被设置了隐藏属性。
        '''
        import stat
        m = os.stat(path).st_mode
        if stat.S_ISDIR(m):
            return True
        if path.startswith('.'):
            return True
        if m & stat.FILE_ATTRIBUTE_HIDDEN:
            return True
        return False

    def rename(self):
        file_path = filedialog.askdirectory(title='ReNamer')
        file_lists = os.listdir(file_path)
        for file in file_lists.copy():
            oldname = file_path + os.sep + file
            # 筛选除了文件夹,还有隐藏文件。
            # if os.path.isdir(oldname):
            if self.shouldIgnore(oldname):
                continue
            else:
                newname = file_path + os.sep + \
                    '(' + str(self.n + 1) + ')' + file
                print(f'rename {oldname} to {newname}')
                self.n += 1
        print(self.n)


root = tk.Tk()
root.geometry("550x200")
label = tk.Label(root, font=("Arial Bold", 15),
                 text='Please select a directory to rename files in the folder:')
label.pack()
ins = ReName()
# command 参数应该是个函数。
#btn=Button(root,font=("Arial",15),bg='orange',text="Click Me",command=ins.rename())
btn = Button(root, font=("Arial", 15), bg='orange',
             text="Click Me", command=ins.rename)
btn.pack()
print(ins.n)
label = tk.Label(root, text=str(ins.n)+' file(s) renamed.')
label.pack()
root.mainloop()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进