python tkinter 动态创建下拉菜单,根据菜单传递不同参数

最近一直在tkinter 的这个坑里。动态创建一个下拉菜单。选择菜单传递不同参数。
一晚上试lambda 语句为什么只传最后一个菜单选项的参数。
最后狂搜一番,发现一个解决的方法。使用了使用functools.partial代替lambda。
只是为了验证可行性的一个程序。逻辑比较乱。重要的实现自己需要的功能。
不停的试,为什么不能实现,有部分没用的语句。懒得删了。
前半部分获取要要创建菜单需要的数据。
后半部分的类实现下拉菜单的语句。
菜单界面

import json
import requests
import os, sys
#Usage:showinfo/warning/error,askquestion/okcancel/yesno/retrycancel
from tkinter.messagebox import *
from tkinter import *
from tkinter.font import Font
from tkinter.ttk import *
#Usage:showinfo/warning/error,askquestion/okcancel/yesno/retrycancel
from tkinter.messagebox import *
#Usage:f=tkFileDialog.askopenfilename(initialdir='E:/Python')
#import tkinter.filedialog as tkFileDialog
#import tkinter.simpledialog as tkSimpleDialog  #askstring()
from functools import partial

def get_tag():
    #酷我精选歌单分类,
	ua={
		'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
		'Referer':'http://www.kuwo.cn/playlists',
		'Cookie':'_ga=GA1.2.2002589455.1638772916; _gid=GA1.2.1373314839.1640043589; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1640043589,1640048527,1640055047,1640136554; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1640136554; kw_token=TJSNCNONXJQ',
		'csrf': 'TJSNCNONXJQ',
	}
	
	url=r'http://www.kuwo.cn/api/www/playlist/getTagList?httpsStatus=1&reqId=acb0bb81-7472-11ec-8913-ff3c3ddd55c5'
	try:
		response=requests.get(url,headers=ua,timeout=30)
		#print (response.text)
		if response.status_code==200:
			jsdata=response.json()
			#print (jsdata)
			rcm=jsdata['data']
			tag_data=[]
			for d in rcm:
			    tag_data.append(d)
			#print (tag_data)	
	except Exception as e:
		print ("获取歌单分类:{} 时错误".format(e))
		
	return (tag_data)

a=get_tag()
global item_menu
item_menu=[]  
for m in a:
	item_menu.append((m['name'],m['data']))

class Application_ui(Frame):
    #这个类仅实现界面生成功能,具体事件处理代码在子类Application中。
   
	def __init__(self, master=None):
		Frame.__init__(self, master)
		self.master.title('三的菜单动态学习)')
		self.master.geometry('800x600')
		self.showmenu()

	def showmenu(self):	
		global item_menu
		self.top = self.winfo_toplevel()
		self.style = Style()
		name_id={}
		self.MainMenu = Menu(self.top, tearoff=0)
		for i,item in enumerate(item_menu):
			if i==6:
				break
			name,data = item
			locals()['i' + str(i)] = Menu(self.MainMenu,tearoff=0)
		
			for d in data:
				#print (name,d['name'],d['id'])
				name_id[d['name']]=d['id']
				cmd=partial(self.m_click, d['name'],d['id'])
				locals()['i' + str(i)].add_command(label=d['name'],command=cmd )
				
			self.MainMenu.add_cascade(menu=locals()['i' + str(i)], label=name)
		self.top['menu'] = self.MainMenu
		

class Application(Application_ui):
    #这个类实现具体的事件处理回调函数。界面生成代码在Application_ui中。
	def __init__(self, master=None):
		Application_ui.__init__(self, master)
    
	def m_click(self,tag,id):

		print (tag,id)


if __name__ == "__main__":
  
  
    top = Tk()
    app=Application(top).mainloop()
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值