Tkinter利用Frame实现界面切换

您所在的位置:网站首页 tkinter中frame控件 Tkinter利用Frame实现界面切换

Tkinter利用Frame实现界面切换

2023-07-01 11:39| 来源: 网络整理| 查看: 265

最近有一个需要,用python搭建一个测试软件。需要三种测试功能,三种功能所需要的参数还不一样,所以操作界面也不一样。在网上看了一些教程,感觉自己水平不够,看不太懂,就自己琢磨了一下,实现了三个界面互相切换的功能,在这里记录一下。(Python3做的)

我的主界面只有输入参数的界面需要切换,其他界面不需要改变。因此我把这个界面所有的组件都放在一个Frame中,利用destroy方法摧毁一个,再新放置另一个Frame,从而实现界面的切换。下面是我截取的界面部分代码,可能多少有点格式的问题,需要小修改。另外我已经把所有按键的触发函数去掉了。后面简单的分析一下代码。

import tkinter as tk #---------主窗口初始化--------- def main_window_init(size = '900x556'): my_window = tk.Tk() #新建一个主窗口 my_window.title('探针测试系统') #窗口名 my_window.geometry(size) #窗口大小 my_window.resizable(width = False,height = False) #是否可以拉伸 #my_window.iconbitmap('001.ico') #图标 return my_window #---------创建IV测试参数输入界面--------- def IV_input_window_init(): #----------参数输入窗口--------- Frame_input = tk.Frame(main_window) #放置所有组件的框架 tk.Label(Frame_input,text='开始电压(V):',bg='#DDDDDD',width=12).grid(row=0,column=0) #起始电压文本 Entry_v_start = tk.Entry(Frame_input,bg='#DDDDDD',width=12) #起始电压输入控件 Entry_v_start.grid(row=0,column=1) tk.Label(Frame_input,text='结束电压(V):',bg='#DDDDDD',width=12).grid(row=1,column=0) #结束电压文本 Entry_v_stop = tk.Entry(Frame_input,bg='#DDDDDD',width=12) #结束电压输入控件 Entry_v_stop.grid(row=1,column=1) tk.Label(Frame_input,text='步长(V):',bg='#DDDDDD',width=12).grid(row=2,column=0) #步长 Entry_step = tk.Entry(Frame_input,bg='#DDDDDD',width=12) #步长输入控件 Entry_step.grid(row=2,column=1) tk.Label(Frame_input,text='延时(ms):',bg='#DDDDDD',width=12).grid(row=3,column=0) #延时 Entry_delay = tk.Entry(Frame_input,bg='#DDDDDD',width=12) #延时 Entry_delay.grid(row=3,column=1) tk.Label(Frame_input,text='限流(A):',bg='#DDDDDD',width=12).grid(row=4,column=0) #限流文本 Entry_compliance = tk.Entry(Frame_input,bg='#DDDDDD',width=12) #限流输入控件 Entry_compliance.grid(row=4,column=1) tk.Label(Frame_input,text='点数(个):',bg='#DDDDDD',width=12).grid(row=5,column=0) #文本 tk.Label(Frame_input,textvariable=num_of_data, bg='#DDDDDD',width=12,relief='ridge').grid(row=5,column=1) #点数 #Rbuttn_sweep_direction = tk.Checkbutton(Frame_input,text='单扫') tk.Button(Frame_input,text='保存',width=12, #保存参数按键 bg='#87CEFA').grid(row=6,column=0) tk.Button(Frame_input,text='运行',width=12, #启动按键 bg='#87CEFA').grid(row=6,column=1) tk.Button(Frame_input,text='清除图像',width=12, #清空 bg='#87CEFA').grid(row=7,column=0) tk.Button(Frame_input,text='退出',width=12, #退出 command=main_window.quit,bg='#87CEFA').grid(row=7,column=1) #Frame_input.place(x=60,y=200) #放置框架 return Frame_input #---------创建IV_t测试参数输入界面--------- def IVt_input_window_init(): #----------参数输入窗口--------- Frame_input = tk.Frame(main_window) #放置所有组件的框架 tk.Label(Frame_input,text='偏置电压(V):').grid(row=0,column=0) #起始电压文本 Entry_v_bias = tk.Entry(Frame_input,bg='#DDDDDD') #起始电压输入控件 Entry_v_bias.grid(row=0,column=1) tk.Label(Frame_input,text='扫描点数:').grid(row=1,column=0) #结束电压文本 Entry_v_stop = tk.Entry(Frame_input,bg='#DDDDDD') #结束电压输入控件 Entry_v_stop.grid(row=1,column=1) tk.Label(Frame_input,text='步长(V):').grid(row=2,column=0) #步长 Entry_step = tk.Entry(Frame_input,bg='#DDDDDD') #步长输入控件 Entry_step.grid(row=2,column=1) tk.Label(Frame_input,text='延时(ms):').grid(row=3,column=0) #延时 Entry_delay = tk.Entry(Frame_input,bg='#DDDDDD') #延时 Entry_delay.grid(row=3,column=1) tk.Button(Frame_input,text='保存',width=12,height=3, #保存参数按键 bg='#0baef4').grid(row=4,column=0) tk.Button(Frame_input,text='运行',width=12,height=3, #启动按键 bg='#0baef4').grid(row=4,column=1) tk.Button(Frame_input,text='CLR',width=12,height=3, #清空 bg='#0baef4').grid(row=5,column=0) tk.Button(Frame_input,text='退出',width=12,height=3, #退出 command=main_window.quit,bg='#0baef4').grid(row=5,column=1) return Frame_input #---------创建Endurance测试参数输入界面--------- def Endurance_input_window_init(): #----------参数输入窗口--------- Frame_input = tk.Frame(main_window) #放置所有组件的框架 tk.Label(Frame_input,text='开始电压(V):').grid(row=0,column=0) #起始电压文本 Entry_v_start = tk.Entry(Frame_input,bg='#DDDDDD') #起始电压输入控件 Entry_v_start.grid(row=0,column=1) tk.Label(Frame_input,text='结束电压(V):').grid(row=1,column=0) #结束电压文本 Entry_v_stop = tk.Entry(Frame_input,bg='#DDDDDD') #结束电压输入控件 Entry_v_stop.grid(row=1,column=1) return Frame_input #---------创建模式选择界面----------- def testmode_switch_init(): Frame_testmode = tk.Frame(main_window,width=900,height=20) #放置所有组件的框架 tk.Button(Frame_testmode,text='I-V测试',width=33,height=2, #I-V测试 command=switch_to_iv,bg='#696969',fg='#FFFFFF', font=("Arial",11)).grid(row=0,column=0) tk.Button(Frame_testmode,text='I-V-t测试',width=33,height=2, #I-V-t测试 command=switch_to_iv_t,bg='#696969',fg='#FFFFFF', font=("Arial",11)).grid(row=0,column=1) tk.Button(Frame_testmode,text='endurance测试',width=33,height=2, #endurrance测试 command=switch_to_endurance,bg='#696969',fg='#FFFFFF', font=("Arial",11)).grid(row=0,column=2) Frame_testmode.place(x=0,y=3) #--------进入IV测试界面---------- def switch_to_iv(): global intput_win1,intput_win2,intput_win3 intput_win1.destroy() intput_win2.destroy() intput_win3.destroy() intput_win1 = IV_input_window_init() #输入界面初始化 intput_win1.place(x=60,y=200) #放置框架 print('iv') #--------进入IV-t测试界面---------- def switch_to_iv_t(): global intput_win1,intput_win2,intput_win3 intput_win1.destroy() intput_win2.destroy() intput_win3.destroy() intput_win2 = IVt_input_window_init() intput_win2.place(x=60,y=200) #放置框架 #--------进入endurance测试界面---------- def switch_to_endurance(): global intput_win1,intput_win2,intput_win3 intput_win1.destroy() intput_win2.destroy() intput_win3.destroy() intput_win3 = Endurance_input_window_init() intput_win3.place(x=60,y=200) #放置框架 #----------创建matplotlib画布---------- def data_canvas_init(): fig = plt.figure(figsize=(6,4),dpi=70) #图像大小和比例 plt.grid() canvas_spice = FigureCanvasTkAgg(fig,main_window) canvas_spice.get_tk_widget().place(x=300,y=100) #放置位置 canvas_spice.draw() return canvas_spice #Test_parameter = parameter_class() #存储测试参数 #keithley_237 = open_instrument() #打开keithley237设备 main_window = main_window_init() #创建主窗口 #num_of_data = tk.IntVar() #保存扫描点数的变量,可以随时更新 #----------背景------------ #设置背景一定要在主函数里,否则不会显示 img_bg = tk.PhotoImage(file="pic/bg_1.gif") #打开图片 canvas_bg = tk.Canvas(main_window,width=900,height=556) #新建一个画布 canvas_bg.create_image(440,278,image = img_bg) #放置背景图片 canvas_bg.place(x=-2,y=0) #放置画布 #global intput_win1,intput_win2,intput_win3 intput_win1 = IV_input_window_init() #输入界面初始化 intput_win2 = IVt_input_window_init() intput_win3 = Endurance_input_window_init() intput_win1.place(x=60,y=200) #放置框架 testmode_switch_init() #测试模式选择界面初始化 canvas_data = data_canvas_init() #图形化数据部分初始化 main_window.mainloop() #开始主循环

 代码里三个Frame的布局是分别在 IV_input_window_init()、IVt_input_window_init()、Endurance_input_window_init()中完成的,布局完成后并没有放置Frame,而是返回了一个Frame。所以我在模式切换的界面,testmode_switch_init()中设置了三个按钮,分别对应了switch_to_iv()、switch_to_iv_t()和switch_to_endurance()三个响应事件。接下来是重点。

 我在主函数里用了三个全局变量intput_win1、intput_win2和intput_win3,分别对应三个Frame,开始的时候默认放置intput_win1,所以用了intput_win1.place()函数。在切换界面按键按下以后,响应函数依次摧毁intput_win1、intput_win2和intput_win3三个Frame。然后重新对着三个全局变量赋值,赋的是三个新的Frame,最后放置对应的一个Frame就可以了。这里有一点需要注意,在函数中对全局变量赋值的时候需要先用global声明一下,否则会报错。

 最后展示一下实际的效果,这个是开始的界面

 

 

按下IVT测试按键后,切换到另一个界面

 

 

 按下endurane测试按键后切换到第三个界面。

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3