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)
#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['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() 是个狠人 先送上分,然后送上我的波灵盖!!学习先!!
页:
[1]