Python GUI編程(Tkinter)文件對話框

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

相關文章
相關標籤/搜索