tkinter的GUI设计:界面与逻辑分离(二)-- 菜单栏

来源:互联网 发布:影楼后期排版软件 编辑:程序博客网 时间:2024/05/19 00:14

由于要用到文件对话框和消息对话框,所以先给出下面的列表。

py2 与 py3 中 tkinter 的变化:  Tkinter         → tkinter    tkMessageBox    → tkinter.messagebox    tkColorChooser  → tkinter.colorchooser    tkFileDialog    → tkinter.filedialog    tkCommonDialog  → tkinter.commondialog    tkSimpleDialog  → tkinter.simpledialog    tkFont          → tkinter.font    Tkdnd           → tkinter.dnd    ScrolledText    → tkinter.scrolledtext    Tix             → tkinter.tix    ttk             → tkinter.ttk说明:本文基于:win7 + python34知识点:1、文件夹对话框 tkinter.filedialog2、消息框 tkinter.messagebox3、菜单栏4、下拉列表 Combobox 的设置效果图:代码:
复制代码
import osimport tkinter as tkfrom tkinter import ttkfrom tkinter import filedialogfrom tkinter import messageboxclass 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()
原创粉丝点击