mytktest1.pypython
import os import tkinter as tk from tkinter import ttk from tkinter import filedialog from tkinter import messagebox class Application(tk.Tk): ''' 文件夾選擇程序 界面與邏輯分離 ''' def __init__(self): '''初始化 ''' super().__init__() # 有點至關於tk.Tk() self.createWidgets() def createWidgets(self): '''界面 ''' self.title('文件夾選擇程序') self.columnconfigure(0, minsize=50) # 定義一些變量 self.entryvar = tk.StringVar() self.keyvar = tk.StringVar() self.keyvar.set('關鍵字') items = ['BufferPool','Close','Data Capture','Compress','Pqty','Sqty'] # 先定義頂部和內容兩個Frame,用來放置下面的部件 topframe = tk.Frame(self, height=80) contentframe = tk.Frame(self) topframe.pack(side=tk.TOP) contentframe.pack(side=tk.TOP) # 頂部區域(四個部件) # -- 前三個直接用 tk 的 widgets,第四個下拉列表 tk 沒有,ttk 纔有,比較麻煩 glabel = tk.Label(topframe, text='當前文件夾:') gentry = tk.Entry(topframe, textvariable=self.entryvar) gbutton = tk.Button(topframe, command=self.__opendir, text='選擇') gcombobox = ttk.Combobox(topframe, values=items, textvariable=self.keyvar) # -- 綁定事件 gentry.bind('<Return>', func=self.__refresh) #gcombobox.bind(‘<ComboboxSelected>‘, func=self.__refresh) # 綁定 <ComboboxSelected> 事件 # -- 放置位置 glabel.grid(row=0, column=0, sticky=tk.W) gentry.grid(row=0, column=1) gbutton.grid(row=0, column=2) gcombobox.grid(row=0, column=3) # 內容區域(三個部件) # -- 前兩個滾動條一個豎直一個水平 rightbar = tk.Scrollbar(contentframe, orient=tk.VERTICAL) bottombar = tk.Scrollbar(contentframe, orient=tk.HORIZONTAL) self.textbox = tk.Text(contentframe, yscrollcommand=rightbar.set, xscrollcommand=bottombar.set) # -- 放置位置 rightbar.pack(side =tk.RIGHT, fill=tk.Y) bottombar.pack(side=tk.BOTTOM, fill=tk.X) self.textbox.pack(side=tk.LEFT, fill=tk.BOTH) # -- 設置命令 rightbar.config(command=self.textbox.yview) bottombar.config(command=self.textbox.xview) def __opendir(self): '''打開文件夾的邏輯''' self.textbox.delete('1.0', tk.END) # 先刪除全部 self.dirname = filedialog.askdirectory() # 打開文件夾對話框 self.entryvar.set(self.dirname) # 設置變量entryvar,等同於設置部件Entry if not self.dirname: messagebox.showwarning('警告', message='未選擇文件夾!') # 彈出消息提示框 self.dirlist = os.listdir(self.entryvar.get()) for eachdir in self.dirlist: self.textbox.insert(tk.END, eachdir+'\r\n') self.textbox.update() def __refresh(self, event=None): '''更新的邏輯''' self.textbox.delete('1.0', tk.END) # 先刪除全部 self.dirlist = os.listdir(self.entryvar.get()) for eachdir in self.dirlist: self.textbox.insert(tk.END, eachdir+'\r\n') self.textbox.update() def addmenu(self, Menu): '''添加菜單 ''' Menu(self) class MyMenu(): '''菜單類''' def __init__(self, root): '''初始化菜單''' self.menubar = tk.Menu(root) # 建立菜單欄 # 建立「文件」下拉菜單 filemenu = tk.Menu(self.menubar, tearoff=0) filemenu.add_command(label="打開", command=self.file_open) filemenu.add_command(label="新建", command=self.file_new) filemenu.add_command(label="保存", command=self.file_save) filemenu.add_separator() filemenu.add_command(label="退出", command=root.quit) # 建立「編輯」下拉菜單 editmenu = tk.Menu(self.menubar, tearoff=0) editmenu.add_command(label="剪切", command=self.edit_cut) editmenu.add_command(label="複製", command=self.edit_copy) editmenu.add_command(label="粘貼", command=self.edit_paste) # 建立「幫助」下拉菜單 helpmenu = tk.Menu(self.menubar, tearoff=0) helpmenu.add_command(label="關於", command=self.help_about) # 將前面三個菜單加到菜單欄 self.menubar.add_cascade(label="文件", menu=filemenu) self.menubar.add_cascade(label="編輯", menu=editmenu) self.menubar.add_cascade(label="幫助", menu=helpmenu) # 最後再將菜單欄整個加到窗口 root root.config(menu=self.menubar) def file_open(self): messagebox.showinfo('打開', '文件-打開!') # 消息提示框 pass def file_new(self): messagebox.showinfo('新建','文件-新建!') # 消息提示框 pass def file_save(self): messagebox.showinfo('保存', '文件-保存!') # 消息提示框 pass def edit_cut(self): messagebox.showinfo('剪切', '編輯-剪切!') # 消息提示框 pass def edit_copy(self): messagebox.showinfo('複製', '編輯-複製!') # 消息提示框 pass def edit_paste(self): messagebox.showinfo('粘貼','編輯-粘貼!') # 消息提示框 pass def help_about(self): messagebox.showinfo('關於', '做者:kinfinger \n verion 1.0 \n 感謝您的使用! \n kinfinge@gmail.com ') # 彈出消息提示框 if __name__ == '__main__': # 實例化Application app = Application() # 添加菜單: app.addmenu(MyMenu) # 主消息循環: app.mainloop()
效果以下:app