tkinter的GUI设计:界面与逻辑分离(三)-- 多页面
知识点:
使用 tkinter.Frame.tkraise() 函数去提升当前 tkinter.Frame 的 z 轴顺序,使得多个 tkinter.Frame 的可见性得以切换
本文基于:win7 + python34
1
2
3
4
5
- import matplotlib
- matplotlib.use("TkAgg")
- from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
- from matplotlib.figure import Figure
- import tkinter as tk
- from tkinter import ttk
- LARGE_FONT= ("Verdana", 12)
- class Application(tk.Tk):
- '''
- 多页面测试程序
- 界面与逻辑分离
- '''
- def __init__(self):
- super().__init__()
- self.iconbitmap(default="kankan_01.ico")
- self.wm_title("多页面测试程序")
- container = tk.Frame(self)
- container.pack(side="top", fill="both", expand = True)
- container.grid_rowconfigure(0, weight=1)
- container.grid_columnconfigure(0, weight=1)
- self.frames = {}
- for F in (StartPage, PageOne, PageTwo, PageThree):
- frame = F(container, self)
- self.frames[F] = frame
- frame.grid(row=0, column=0, sticky="nsew") # 四个页面的位置都是 grid(row=0, column=0), 位置重叠,只有最上面的可见!!
- self.show_frame(StartPage)
- def show_frame(self, cont):
- frame = self.frames[cont]
- frame.tkraise() # 切换,提升当前 tk.Frame z轴顺序(使可见)!!此语句是本程序的点睛之处
- class StartPage(tk.Frame):
- '''主页'''
- def __init__(self, parent, root):
- super().__init__(parent)
- label = tk.Label(self, text="这里是主页", font=LARGE_FONT)
- label.pack(pady=10,padx=10)
- button1 = ttk.Button(self, text="去到第一页", command=lambda: root.show_frame(PageOne)).pack()
- button2 = ttk.Button(self, text="去到第二页", command=lambda: root.show_frame(PageTwo)).pack()
- button3 = ttk.Button(self, text="去到绘图页", command=lambda: root.show_frame(PageThree)).pack()
- class PageOne(tk.Frame):
- '''第一页'''
- def __init__(self, parent, root):
- super().__init__(parent)
- label = tk.Label(self, text="这是第一页", font=LARGE_FONT)
- label.pack(pady=10,padx=10)
- button1 = ttk.Button(self, text="回到主页", command=lambda: root.show_frame(StartPage)).pack()
- button2 = ttk.Button(self, text="去到第二页", command=lambda: root.show_frame(PageTwo)).pack()
- class PageTwo(tk.Frame):
- '''第二页'''
- def __init__(self, parent, root):
- super().__init__(parent)
- label = tk.Label(self, text="这是第二页", font=LARGE_FONT)
- label.pack(pady=10,padx=10)
- button1 = ttk.Button(self, text="回到主页", command=lambda: root.show_frame(StartPage)).pack()
- button2 = ttk.Button(self, text="去到第一页", command=lambda: root.show_frame(PageOne)).pack()
- class PageThree(tk.Frame):
- '''第三页'''
- def __init__(self, parent, root):
- super().__init__(parent)
- tk.Label(self, text="这是绘图页", font=LARGE_FONT).pack(pady=10,padx=10)
- button1 = ttk.Button(self, text="回到主页", command=lambda: root.show_frame(StartPage)).pack()
- fig = Figure(figsize=(5,5), dpi=100)
- a = fig.add_subplot(111)
- a.plot([1,2,3,4,5,6,7,8],[5,6,1,3,8,9,3,5])
- canvas = FigureCanvasTkAgg(fig, self)
- canvas.show()
- canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
- toolbar = NavigationToolbar2TkAgg(canvas, self)
- toolbar.update()
- canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
- if __name__ == '__main__':
- # 实例化Application
- app = Application()
- # 主消息循环:
- app.mainloop()
tkinter的GUI设计:界面与逻辑分离(三)-- 多页面的更多相关文章
- tkinter的GUI设计:界面与逻辑分离(一)-- 初次见面
PyQt实现界面与逻辑分离的设计很是方便,详情可以见我的第一篇博文. 不过本文将使用python的标准库 tkinter,来实现界面与逻辑分离的GUI 设计. 我们来设计一个很简单的程序: 目的:长度 ...
- tkinter的GUI设计:界面与逻辑分离(四)-- 与 matplotlib 结合
有些场合,我们需要对数据可视化.单是靠 tkinter 难度太大,而且做出来的效果不一定理想. 此时,将 tkinter 与 matplotlib 结合,是最好的选择. 知识点: 将 tkinter ...
- tkinter的GUI设计:界面与逻辑分离(二)-- 菜单栏
由于要用到文件对话框和消息对话框,所以先给出下面的列表. py2 与 py3 中 tkinter 的变化: Tkinter → tkinter tkMessageBox → tkinter.messa ...
- 解析大型.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 ...
- java.awt包提供了基本的java程序的GUI设计工具
java.awt包提供了基本的java程序的GUI设计工具.主要包括下述三个概念: 组件--Component 容器--Container 布局管理器--LayoutManager package T ...
- Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范与推荐标准
Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范与推荐标准 1. 界面gui方面的前后端分离重大意义1 2. 业务逻辑也适当的迁移js化1 3. 常用分离方法2 3.1. 页面 ...
随机推荐
- linux克隆机器
首先你要先点击你的虚拟机点击克隆: 然后执行这个 vim /etc/sysconfig/network-scripts/ifcfg-eth0 去这里修改这两行 然后注释了 然后再执行这个 > / ...
- 更新tableView的某个cell
更新tableView的某个cell 异步加载完数据后更新某个cell,这应该是非常常见的使用方法了,我们经常会用reloadData. 效果: 源码: // // RootViewControlle ...
- UINavigationController便于pop的category
UINavigationController便于pop的category 效果图: 这个category是为了方便UINavigationController用于跳转到指定的控制器当中,用于跳级,如果 ...
- Linux优化远程SSH连接
优化远程SSH连接 1.Linxu和Window的ssh连接区别 Windom默认3389端口,管理员administartor 普通是guest Linux 默认22端口 管理员root 普通一堆 ...
- struts2.5动态方法绑定问题
<global-allowed-methods>regex:.*</global-allowed-methods> <?xml version="1.0&quo ...
- php中empty(),isset(),is_null(),==,===区别
有关 PHP 的 empty(),isset() 还有 is_null() 这三个函数的用法讨论得已经很多了,而且很多资料也未必能说得很清楚.这里再重复一次,但不是从概念去说,直接用程序例子来说话,应 ...
- 【转】Json判断是否存在某个属性和遍历各个属性和值
var field='uid'; var jsonObj={uid:'001'}; 一. jsonObj[field] != undefined //注意:如果field值正好是undefined那就 ...
- 实现body背景拉伸自适应 兼容chrome ie7,8,9.ie6未测试
html, body {/*此部分支持chrome,应该也支持firefox*/ background: rgb(246,248,249); background: url('/styles/imag ...
- Uva821 Page Hopping (Floyd)
题目大意: 最近的研究表明,互联网上任何一个网页在平均情况下最多只需要单击19次就能到达任 意一个其他网页.如果把网页看成一个有向图中的结点,则该图中任意两点间最短距离的平 均值为19. 输入一个n( ...
- 8年前,令我窒息的Java socket体验学习
本来已经放弃编程了,那时我发誓再也不去IT培训班了,如果找不到工作,我就去工地上打工.可心有不甘,老是惦记着,我不想天天面对生产线,做一个丧失思考能力的操作工,可后来呀,还是走上了程序员之路...这么 ...