tkinter的GUI设计:界面与逻辑分离(二)-- 菜单栏
由于要用到文件对话框和消息对话框,所以先给出下面的列表。
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.filedialog
2、消息框 tkinter.messagebox
3、菜单栏
4、下拉列表 Combobox 的设置 效果图:
代码:
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()
tkinter的GUI设计:界面与逻辑分离(二)-- 菜单栏的更多相关文章
- tkinter的GUI设计:界面与逻辑分离(一)-- 初次见面
PyQt实现界面与逻辑分离的设计很是方便,详情可以见我的第一篇博文. 不过本文将使用python的标准库 tkinter,来实现界面与逻辑分离的GUI 设计. 我们来设计一个很简单的程序: 目的:长度 ...
- tkinter的GUI设计:界面与逻辑分离(四)-- 与 matplotlib 结合
有些场合,我们需要对数据可视化.单是靠 tkinter 难度太大,而且做出来的效果不一定理想. 此时,将 tkinter 与 matplotlib 结合,是最好的选择. 知识点: 将 tkinter ...
- tkinter的GUI设计:界面与逻辑分离(三)-- 多页面
知识点: 使用 tkinter.Frame.tkraise() 函数去提升当前 tkinter.Frame 的 z 轴顺序,使得多个 tkinter.Frame 的可见性得以切换 本文基于:win7 ...
- 解析大型.NET ERP系统 界面与逻辑分离
Windows Forms程序实现界面与逻辑分离的关键是数据绑定技术(Data Binding),这与微软推出的ASP.NET MVC的原理相同,分离业务代码与界面层,提高系统的可维护性. 数据绑定 ...
- PyQt5系列教程(六)如何让界面和逻辑分离
软硬件环境 OS X EI Capitan Python 3.5.1 PyQt 5.5.1 PyCharm 5.0.3 前言 前面的内容我们介绍了利用QtDesigner来设计界面,再通过命令行工具p ...
- Python:Tkinter的GUI设计——物体实时移动
参考: 1.Tkinter之Canvas篇 2.python GUI实践:做一个满图乱跑的小球 3.[Tkinter 教程08] Canvas 图形绘制 4.tkinter模块常用参数(python3 ...
- pyqt5界面与逻辑分离--信号槽的装饰器实现方式
本文展示了 pyqt5 信号槽的装饰器实现方式(借鉴自 eirc6) 一个简单的例子.实现功能:两个数相加,显示结果.如图 两个文件,第一个是界面文件 ui_calc.py # ui_calc.py ...
- Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范与推荐标准
Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范与推荐标准 1. 界面gui方面的前后端分离重大意义1 2. 业务逻辑也适当的迁移js化1 3. 常用分离方法2 3.1. 页面 ...
- tkinter——GUI设计实操
1.创建root: from tkinter import * root = Tk() root.title('GUI设计') # root.attributes("-alpha" ...
随机推荐
- 数据契约(DataContract)里的DataMember特性
数据契约(DataContract) 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可 ...
- linux下jira搭建&破解(转自:https://www.cnblogs.com/zpw-1/p/9553358.html)
写在前面 网络类似文章不少,但是同样的路,别人走可能一马平川,自己走可能磕磕绊绊.记录一下自己搭建过程的一路踩坑历程[目前还记得的]. 一.环境准备 1,jira7.3的运行是依赖java环境的,也就 ...
- CSS学习摘要-定位
CSS学习摘要-定位 注:全文摘自MDN-CSS定位 定位允许您从正常的文档流布局中取出元素,并使它们具有不同的行为,例如放在另一个元素的上面,或者始终保持在浏览器视窗内的同一位置. 本文解释的是定位 ...
- 铁乐学python_day05-作业
1,有如下变量(tu是个元祖),请实现要求的功能 tu = ("alex", [11, 22, {"k1": 'v1', "k2": [&q ...
- UI(三)
1. 2.经常用到的loadmap函数 void CTopology::LoadMap() { //m_map.RemoveAllLayers(); AddLayersBasemap(); AddLa ...
- 编程题1001.A+B Format (20)
代码链接点击这里 由于有点久没写代码了,本次作业提交了三次才全部正解. 一开始以为是非常容易的题目,就没有带入多组数据,便以最简单的思路提交了代码. 发现了有特别多错误后,我并没有选择马上找同学帮忙, ...
- ajax 跨域解决方法
最近在开发过程中,使用ajax去异步调取图片.在开发中这个功能没什么问题,可以后来提测,重新部署之后就有问题了,这就是ajax的跨域问题. ajax核心对象XMLHttpRequest本身是不支持跨域 ...
- [装]JMX监控Hadoop
http://chenjc-it.iteye.com/blog/1539746 实验成功!
- oracle 禁用/启动job
注意:dbms_job只能在job的所在用户使用,如果broken其它用户的job用dbms_ijob dbms_job只能在当期用户内创建job.修改和删除job,不能对其他用户的job进行操作;s ...
- Java常用的快捷键
// // (1)Ctrl+Space // 说明:内容助理.提供对方法,变量,参数,javadoc等得提示, // 应运在多种场合,总之需要提示的时候可先按此快捷键. // 注:避免输入法的切换设置 ...