Python tkinter: создать динамическое выпадающее меню и вызывать различные действия после выбора - PullRequest
0 голосов
/ 31 января 2019

Я довольно новичок в python, и впервые использую tkinter, поэтому надеюсь, что кто-нибудь поможет мне найти правильное направление.

В основном это то, чего я хотел бы достичь:

  1. Я извлекаю из списков XML 2 (APP, ID);
  2. Список приложений будет отображаться в выпадающем меню;
  3. Выбор приложения в раскрывающемся меню вызовет статус приложения, используя его идентификатор.

Я не могу получить последнюю точку работы, в основном, я думаю, что понимаю, почему (у меня естьнет совпадения между двумя списками или функцией для их сопоставления, и выбор автоматически вызывает последний идентификатор второго списка), но, насколько я знаю, я не могу его решить.

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 голосов
/ 31 января 2019

Как уже упоминалось в моем комментарии, проблема в том, что ваша 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')}
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...