Python tkinter:创建动态下拉菜单,并在选择后调用不同的操作

时间:2019-01-31 15:48:19

标签: python tkinter

我对python很陌生,这是我第一次使用tkinter,所以我希望有人可以帮助我找到正确的方向。

基本上,这就是我想要实现的目标:

  1. 我从XML 2列表(APP,ID)中检索;
  2. APP列表将显示在下拉菜单中;
  3. 下拉菜单中的APP选择将使用其ID调用APP状态。

我无法完成最后一点,基本上我想我理解为什么(两个列表之间没有匹配项,或者没有匹配它们的函数,并且选择自动调用了第二个列表的最后一个ID),但是我据我所知无法解决。

import requests
import xml.etree.ElementTree as ET

import tkinter as tk

APP_OPTIONS = []
ID_OPTIONS = []

session = requests.Session()
session.auth = ('USER', 'PW')
applications = session.get('https://getapplicationslist.myurl.com/application/')
applications_xml = applications.content
root = ET.fromstring(applications_xml)
for application in root.findall('application'):
    app_name = application.find('name').text
    app_id = application.find('id').text
    APP_OPTIONS.append(app_name)
    ID_OPTIONS.append(app_id)

def appcall(*args):
    app_status = session.get('https://getapplicationstatus.myurl.com?Id=' + app_id)
    status_xml = app_status.content
    root = ET.fromstring(status_xml)
    for appStatus in root.findall('appStatus'):
        status = appStatus.find('status').text
        print(status)

root = tk.Tk()
root.title('Application List')
root.geometry("300x200")

var =tk.StringVar(root)
var.set('Choose an Application')
var.trace('w', appcall)

dropDownMenu = tk.OptionMenu(root, var, *APP_OPTIONS)
dropDownMenu.pack()

root.mainloop()
print('End Request')

1 个答案:

答案 0 :(得分:0)

如我的评论中所述,问题是您在app_id中的appcall没有变化。您需要从ID获取相应的ID_OPTIONS

def appcall(*args):
    app_id = ID_OPTIONS[APP_OPTIONS.index(var.get())]  # Add this line
    app_status = session.get('https://getapplicationstatus.myurl.com?Id=' + app_id)
    ...

app_id现在基于ID_OPTIONS设置为相同索引的app_name(因为插入顺序相同)。

但是,更好的方法是将您的选项初始化为字典:

# instead of APP_OPTIONS / ID_OPTIONS, create:
apps = {}

...

for application in root.findall('application'):
    app_name = application.find('name').text
    app_id = application.find('id').text
    # add to dictionary here:
    apps[app_name] = app_id

def appcall(*args):
    # Change the app_id to apps.get(var.get())
    app_status = session.get('https://getapplicationstatus.myurl.com?Id=' + apps.get(var.get())
    ...

看看调用同一参考文献要简单多少?

如果您对语言感到满意,甚至可以选择对字典的理解:

...
root = ET.fromstring(applications_xml)
app_id = {application.find('name').text: application.find('id').text for application in root.findall('application')}
...