dtsuifeng 发表于 2022-1-14 21:15

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()

唯爱丶雪 发表于 2022-1-15 09:23

是个狠人

woai2003 发表于 2022-2-10 20:26

先送上分,然后送上我的波灵盖!!学习先!!
页: [1]
查看完整版本: python 使用 tkinter 动态创建下拉菜单,根据菜单传递不同参数