tkinter1 - 主界面批量添加菜单栏

初衷

最近在用python tkinter做GUI界面项目。项目分多个模块,多人配合,最后整合到主界面上。
为了避免大篇幅修改主界面,采用批量加菜单栏的方式设定主界面,只要配置GUIdict就能完成主界面与模块界面的关联,十分方便。

思路

  1. 首先分析主界面菜单栏生成的模式,最简单的方法是:
menubar = tk.Menu(root)
menubar.add_command(command='按钮对应的控制函数',
             label='按钮的显示名称',{'其他参数诸如颜色字体等':'...'})
root['menu'] = menubar#指定主窗口的'menu'属性为刚刚创建的menubar 

其中的add_command以退出键为例:

args = {'background':"#ffff00",
        'font':"TkMenuFont",
        'foreground':"#000000"}
def quit():
    root.destroy()
menubar.add_command(
         command=quit,
         label="Quit",**args)
  1. 批量添加菜单栏的问题转化成批量读取“按钮的显示名称”和“按钮对应的控制函数”。为此,设定一个GUIdict包含{“按钮的显示名称”:“按钮对应的控制函数”}。
  2. 关于按钮对应的控制函数:
    • 各模块控制函数大家约定好,以xxgui.start( ∗ ∗ a r g s **args args)来实现即可。
    • 为了不影响从主函数中传入 ∗ ∗ a r g s **args args,把模块控制函数转成func = xxgui.start ,调用时采用func( ∗ ∗ a r g s **args args)方式。为了批量写成eval(’%s.start’%模块类名),配合使用时菜单按钮的command=lambda:start_func(self.root,self.maindata,self.info)。【lambda式是保证正常运行,否则command接收到的将是start_func(self.root,self.maindata,self.info)的运行结果而报错】
    • 于是GUIdict包含{“按钮的显示名称”:eval(’%s.start’%模块类名)}

python tkinter实现

class appGUI:
    def __init__(self):
        pass
    @staticmethod
    def start(*args):
        pass

class appGUI2:
    def __init__(self):
        pass
    @staticmethod
    def start(*args):
        pass
        
#GUIdict = {"按钮的显示名称":eval('%s.start'%模块类名)}
GUIdict = {"app":eval('%s.start'%'appGUI'),
           "app2":eval('%s.start'%'appGUI2')}
           
class mainGUI:
    def __init__(self,maindata):
        self.maindata = maindata
        self.root = tk.Tk()
		self.menubar = tk.Menu(self.root,bg='#ff0000',fg='#000000')

		#基于GUIdict添加各模块对应按钮
		args = {'activebackground':"#d9d9d9",
		        'activeforeground':"#000000",
		        'background':"#ffff00",
		        'font':"TkMenuFont",
		        'foreground':"#000000"}
		for name,start_func in GUIdict.items():
		    self.menubar.add_command(
		    command=lambda:start_func(self.root,self.maindata),
		    label=name,**args)
		self.root['menu'] = self.menubar#指定主窗口的'menu'属性为刚刚创建的menubar
		self.root.mainloop()

if __name__ =='__main__':
    mainGUI()	
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值