知识点:

使用 tkinter.Frame.tkraise() 函数去提升当前 tkinter.Frame 的 z 轴顺序,使得多个 tkinter.Frame 的可见性得以切换

本文基于:win7 + python34

1

2

3

4

5

  1. import matplotlib
  2. matplotlib.use("TkAgg")
  3. from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
  4. from matplotlib.figure import Figure
  5.  
  6. import tkinter as tk
  7. from tkinter import ttk
  8.  
  9. LARGE_FONT= ("Verdana", 12)
  10.  
  11. class Application(tk.Tk):
  12. '''
  13. 多页面测试程序
  14. 界面与逻辑分离
  15. '''
  16. def __init__(self):
  17.  
  18. super().__init__()
  19.  
  20. self.iconbitmap(default="kankan_01.ico")
  21. self.wm_title("多页面测试程序")
  22.  
  23. container = tk.Frame(self)
  24. container.pack(side="top", fill="both", expand = True)
  25. container.grid_rowconfigure(0, weight=1)
  26. container.grid_columnconfigure(0, weight=1)
  27.  
  28. self.frames = {}
  29. for F in (StartPage, PageOne, PageTwo, PageThree):
  30. frame = F(container, self)
  31. self.frames[F] = frame
  32. frame.grid(row=0, column=0, sticky="nsew") # 四个页面的位置都是 grid(row=0, column=0), 位置重叠,只有最上面的可见!!
  33.  
  34. self.show_frame(StartPage)
  35.  
  36. def show_frame(self, cont):
  37. frame = self.frames[cont]
  38. frame.tkraise() # 切换,提升当前 tk.Frame z轴顺序(使可见)!!此语句是本程序的点睛之处
  39.  
  40. class StartPage(tk.Frame):
  41. '''主页'''
  42. def __init__(self, parent, root):
  43. super().__init__(parent)
  44. label = tk.Label(self, text="这里是主页", font=LARGE_FONT)
  45. label.pack(pady=10,padx=10)
  46.  
  47. button1 = ttk.Button(self, text="去到第一页", command=lambda: root.show_frame(PageOne)).pack()
  48. button2 = ttk.Button(self, text="去到第二页", command=lambda: root.show_frame(PageTwo)).pack()
  49. button3 = ttk.Button(self, text="去到绘图页", command=lambda: root.show_frame(PageThree)).pack()
  50.  
  51. class PageOne(tk.Frame):
  52. '''第一页'''
  53. def __init__(self, parent, root):
  54. super().__init__(parent)
  55. label = tk.Label(self, text="这是第一页", font=LARGE_FONT)
  56. label.pack(pady=10,padx=10)
  57.  
  58. button1 = ttk.Button(self, text="回到主页", command=lambda: root.show_frame(StartPage)).pack()
  59. button2 = ttk.Button(self, text="去到第二页", command=lambda: root.show_frame(PageTwo)).pack()
  60.  
  61. class PageTwo(tk.Frame):
  62. '''第二页'''
  63. def __init__(self, parent, root):
  64. super().__init__(parent)
  65. label = tk.Label(self, text="这是第二页", font=LARGE_FONT)
  66. label.pack(pady=10,padx=10)
  67.  
  68. button1 = ttk.Button(self, text="回到主页", command=lambda: root.show_frame(StartPage)).pack()
  69. button2 = ttk.Button(self, text="去到第一页", command=lambda: root.show_frame(PageOne)).pack()
  70.  
  71. class PageThree(tk.Frame):
  72. '''第三页'''
  73. def __init__(self, parent, root):
  74. super().__init__(parent)
  75. tk.Label(self, text="这是绘图页", font=LARGE_FONT).pack(pady=10,padx=10)
  76.  
  77. button1 = ttk.Button(self, text="回到主页", command=lambda: root.show_frame(StartPage)).pack()
  78.  
  79. fig = Figure(figsize=(5,5), dpi=100)
  80. a = fig.add_subplot(111)
  81. a.plot([1,2,3,4,5,6,7,8],[5,6,1,3,8,9,3,5])
  82.  
  83. canvas = FigureCanvasTkAgg(fig, self)
  84. canvas.show()
  85. canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
  86.  
  87. toolbar = NavigationToolbar2TkAgg(canvas, self)
  88. toolbar.update()
  89. canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
  90.  
  91. if __name__ == '__main__':
  92. # 实例化Application
  93. app = Application()
  94.  
  95. # 主消息循环:
  96. app.mainloop()

tkinter的GUI设计:界面与逻辑分离(三)-- 多页面的更多相关文章

  1. tkinter的GUI设计:界面与逻辑分离(一)-- 初次见面

    PyQt实现界面与逻辑分离的设计很是方便,详情可以见我的第一篇博文. 不过本文将使用python的标准库 tkinter,来实现界面与逻辑分离的GUI 设计. 我们来设计一个很简单的程序: 目的:长度 ...

  2. tkinter的GUI设计:界面与逻辑分离(四)-- 与 matplotlib 结合

    有些场合,我们需要对数据可视化.单是靠 tkinter 难度太大,而且做出来的效果不一定理想. 此时,将 tkinter 与 matplotlib 结合,是最好的选择. 知识点: 将 tkinter ...

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

    由于要用到文件对话框和消息对话框,所以先给出下面的列表. py2 与 py3 中 tkinter 的变化: Tkinter → tkinter tkMessageBox → tkinter.messa ...

  4. 解析大型.NET ERP系统 界面与逻辑分离

    Windows Forms程序实现界面与逻辑分离的关键是数据绑定技术(Data Binding),这与微软推出的ASP.NET MVC的原理相同,分离业务代码与界面层,提高系统的可维护性. 数据绑定 ...

  5. PyQt5系列教程(六)如何让界面和逻辑分离

    软硬件环境 OS X EI Capitan Python 3.5.1 PyQt 5.5.1 PyCharm 5.0.3 前言 前面的内容我们介绍了利用QtDesigner来设计界面,再通过命令行工具p ...

  6. Python:Tkinter的GUI设计——物体实时移动

    参考: 1.Tkinter之Canvas篇 2.python GUI实践:做一个满图乱跑的小球 3.[Tkinter 教程08] Canvas 图形绘制 4.tkinter模块常用参数(python3 ...

  7. pyqt5界面与逻辑分离--信号槽的装饰器实现方式

    本文展示了 pyqt5 信号槽的装饰器实现方式(借鉴自 eirc6) 一个简单的例子.实现功能:两个数相加,显示结果.如图 两个文件,第一个是界面文件 ui_calc.py # ui_calc.py ...

  8. java.awt包提供了基本的java程序的GUI设计工具

    java.awt包提供了基本的java程序的GUI设计工具.主要包括下述三个概念: 组件--Component 容器--Container 布局管理器--LayoutManager package T ...

  9. Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范与推荐标准

    Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范与推荐标准 1. 界面gui方面的前后端分离重大意义1 2. 业务逻辑也适当的迁移js化1 3. 常用分离方法2 3.1. 页面 ...

随机推荐

  1. linux克隆机器

    首先你要先点击你的虚拟机点击克隆: 然后执行这个 vim /etc/sysconfig/network-scripts/ifcfg-eth0 去这里修改这两行 然后注释了 然后再执行这个 > / ...

  2. 更新tableView的某个cell

    更新tableView的某个cell 异步加载完数据后更新某个cell,这应该是非常常见的使用方法了,我们经常会用reloadData. 效果: 源码: // // RootViewControlle ...

  3. UINavigationController便于pop的category

    UINavigationController便于pop的category 效果图: 这个category是为了方便UINavigationController用于跳转到指定的控制器当中,用于跳级,如果 ...

  4. Linux优化远程SSH连接

    优化远程SSH连接 1.Linxu和Window的ssh连接区别 Windom默认3389端口,管理员administartor 普通是guest Linux 默认22端口 管理员root 普通一堆 ...

  5. struts2.5动态方法绑定问题

    <global-allowed-methods>regex:.*</global-allowed-methods> <?xml version="1.0&quo ...

  6. php中empty(),isset(),is_null(),==,===区别

    有关 PHP 的 empty(),isset() 还有 is_null() 这三个函数的用法讨论得已经很多了,而且很多资料也未必能说得很清楚.这里再重复一次,但不是从概念去说,直接用程序例子来说话,应 ...

  7. 【转】Json判断是否存在某个属性和遍历各个属性和值

    var field='uid'; var jsonObj={uid:'001'}; 一. jsonObj[field] != undefined //注意:如果field值正好是undefined那就 ...

  8. 实现body背景拉伸自适应 兼容chrome ie7,8,9.ie6未测试

    html, body {/*此部分支持chrome,应该也支持firefox*/ background: rgb(246,248,249); background: url('/styles/imag ...

  9. Uva821 Page Hopping (Floyd)

    题目大意: 最近的研究表明,互联网上任何一个网页在平均情况下最多只需要单击19次就能到达任 意一个其他网页.如果把网页看成一个有向图中的结点,则该图中任意两点间最短距离的平 均值为19. 输入一个n( ...

  10. 8年前,令我窒息的Java socket体验学习

    本来已经放弃编程了,那时我发誓再也不去IT培训班了,如果找不到工作,我就去工地上打工.可心有不甘,老是惦记着,我不想天天面对生产线,做一个丧失思考能力的操作工,可后来呀,还是走上了程序员之路...这么 ...