Python pywinauto查句柄 python 获取句柄_文件名


图还是原来那个图,本文继续优化代码的过程。以下是前面说明使用过的构建文件重命名对话框的代码,功能是构建一个修改文件名对话框。

# 构建顶层窗口作为对话框rename_dlg = Toplevel(takefocus=True)# 指定窗口标题rename_dlg.title('Rename')# 禁止窗口尺寸调整rename_dlg.resizable(width=False, height=False)# 构建Frame对象以容纳Label和Entry对象# 使用Frame可以分别调整Label/Entry区域和下面的按钮区域fn_frame = Frame(rename_dlg)fn_frame.grid(row=0,column=0)Label(fn_frame, text='File Name:').grid(row=0, column=0)fn_var = StringVar()fn_var.set(fn)fn_entry = Entry(fn_frame, textvariable=fn_var)fn_entry.grid(row=0, column=1)# 构建Frame对象以容纳OK和Cancel按钮btn_frame = Frame(rename_dlg)btn_frame.grid(row=1, column=0, sticky='e')# 通过labmda表达式传递构建按钮控件时的对话框控件,路径和文件名信息# 修改后的文件名要在按下【OK】按钮是通过fn_var.get获取。ok_btn = Button(btn_frame, text='OK', command=(lambda w=rename_dlg,p=path,s=fn: rename_ok(w,p,s,fn_var.get())))ok_btn.grid(row=0, column=0)# 取消按钮直接销毁窗口对象cancel_btn=Button(btn_frame, text='Cancel', command=rename_dlg.destroy)cancel_btn.grid(row=0, column=1)# 限定rename_dlg接收鼠标和键盘事件,这是实现模态对话框的关键。rename_dlg.grab_set()# 使对话框相对于root窗口居中center_window(rename_dlg, root)# 启动对话框主循环rename_dlg.mainloop()# 销毁对话框窗口rename_dlg.destroy()

如果观察代码可以知道,从第7行到第27行为止是FileBrowser的实际需要的功能,其他的代码则是构建任何对话框都需要的处理。以下用用一个类将这部分功能独立出来:

class Dialog(Toplevel): def __init__(self, ref, title): Toplevel.__init__(self, takefocus=True) self.ref = ref # 指定窗口标题 self.title(title) # 禁止窗口尺寸调整 self.resizable(width=False, height=False) self.create_widgets() # 限定rename_dlg接收鼠标和键盘事件,这是实现模态对话框的关键。 self.grab_set() # 使对话框相对于root窗口居中 center_window(self, ref) # 启动对话框主循环 self.mainloop() def create_widgets(self): pass

当需要构建自己的对话框时只要继承Dialog可并实现create_widgets方法即可:

class RenameDialog(Dialog): def __init__(self, file_list, path, fn): self.path = path self.fn = fn self.fn_var = StringVar() self.fn_var.set(self.fn) Dialog.__init__(self, file_list.winfo_toplevel(), 'Rename File') def create_widgets(self): # 构建Frame对象以容纳Label和Entry对象 # 使用Frame可以分别调整Label/Entry区域和下面的按钮区域 fn_frame = Frame(self) fn_frame.grid(row=0, column=0) Label(fn_frame, text='File Name:').grid(row=0, column=0) fn_entry = Entry(fn_frame, textvariable=self.fn_var) fn_entry.grid(row=0, column=1) # 构建Frame对象以容纳OK和Cancel按钮 btn_frame = Frame(self) btn_frame.grid(row=1, column=0, sticky='e') # 通过labmda表达式传递构建按钮控件时的对话框控件,路径和文件名信息 # 修改后的文件名要在按下【OK】按钮是通过fn_var.get获取。 ok_btn = Button(btn_frame, text='OK', command=self.__rename) ok_btn.grid(row=0, column=0) # 取消按钮直接销毁窗口对象 cancel_btn = Button(btn_frame, text='Cancel', command=self.destroy) cancel_btn.grid(row=0, column=1)

可以看到,RenameDlg类中只剩下FileBrowser相关的部分了。将这部分功能封装成类的另一个好处是使用对话框的代码变得简单了:

def __rename(self): if self.fn_var.get() == self.fn: return try: src = os.path.join(self.path, self.fn) des = os.path.join(self.path, self.fn_var.get()) os.rename(src, des) except Exception as e: showerror('Error', str(e)) self.quit()

只要将文件的路径名和文件名传递给RenameDialog就一切OK。这才是代码本来应该有的样子吧。

完整代码可以从以下地址下载:

https://github.com/xueweiguo/TkinterPrimer/blob/master/FileBrowser