Подробнее о Python TKinter Dynamic OptionMenu

Я пытаюсь изменить код здесь, чтобы пользователь подтвердил элементы, выбранные из дополнительного optionmenus . Если пользователь нажимает кнопку «Отправить», окно сообщения должно открывать запрос подтверждения. Наконец, я хочу, чтобы выбранные элементы возвращались в программу как переменные, чтобы их можно было использовать в других функциях для дальнейшей обработки. Однако моя модификация не работает; он просто возвращает пустое окно. Мысли о том, чего я не хватает? Большое спасибо.

 from tkinter import * import tkinter.messagebox class App(Frame): def __init__(self, master): Frame.__init__(self, master) self.dict = {'Asia': ['Japan', 'China', 'Malasia'], 'Europe': ['Germany', 'France', 'Switzerland'], 'Africa': ['Nigeria', 'Kenya', 'Ethiopia']} self.variable_a = StringVar(self) self.variable_b = StringVar(self) self.variable_a.trace('w', self.updateoptions) self.optionmenu_a = OptionMenu(self, self.variable_a, *self.dict.keys()) self.variable_a.set('Asia') self.optionmenu_a.pack() self.optionmenu_b = OptionMenu(self, self.variable_b, ()) self.optionmenu_b.pack() self.btn = Button(self, text="Submit", width=8, command=self.submit) self.btn.pack() self.pack() def updateoptions(self, *args): countries = self.dict[self.variable_a.get()] self.variable_b.set(countries[0]) menu = self.optionmenu_b['menu'] menu.delete(0, 'end') for country in countries: menu.add_command(label=country, command=lambda country=country: self.variable_b.set(country)) def submit(self, *args): var1 = self.variable_a.get() var2 = self.variable_b.get() if tkinter.messagebox.askokcancel("Selection", "Confirm selection: " + var1 + ' ' + var2): print(var1, var2) #Or can be other function for further processing root = Tk() app = App(root) app.mainloop() 

Версия Python 3.4.1

EDIT: теперь появляется окно с виджетами. Я опустил self. перед кнопкой. Я все еще получаю сообщение об ошибке, которое я пытаюсь разобраться: AttributeError: объект «App» не имеет атрибута «optionmenu_b»

One Solution collect form web for “Подробнее о Python TKinter Dynamic OptionMenu”

Здесь @sedeh, это работает так, как вы этого хотели. Ошибка произошла не из ваших дополнений, но я думаю, что при использовании from tkinter import * вместо import tkinter as tk , вот почему при запуске вашего кода ошибка возникает, как только появляется окно tk.

То, что я сделал, – это взять код из предоставленной вами ссылки, добавить то, что вы сделали, и работает без ошибок.

 import tkinter as tk import tkinter.messagebox class App(tk.Frame): def __init__(self, master): tk.Frame.__init__(self, master) self.dict = {'Asia': ['Japan', 'China', 'Malasia'], 'Europe': ['Germany', 'France', 'Switzerland'], 'Africa': ['Nigeria', 'Kenya', 'Ethiopia']} self.variable_a = tk.StringVar(self) self.variable_b = tk.StringVar(self) self.variable_a.trace('w', self.updateoptions) self.optionmenu_a = tk.OptionMenu(self, self.variable_a, *self.dict.keys()) self.optionmenu_b = tk.OptionMenu(self, self.variable_b, '') self.variable_a.set('Asia') self.optionmenu_a.pack() self.optionmenu_b.pack() self.btn = tk.Button(self, text="Submit", width=8, command=self.submit) self.btn.pack() self.pack() def updateoptions(self, *args): countries = self.dict[self.variable_a.get()] self.variable_b.set(countries[0]) menu = self.optionmenu_b['menu'] menu.delete(0, 'end') for country in countries: menu.add_command(label=country, command=lambda country=country: self.variable_b.set(country)) def submit(self, *args): var1 = self.variable_a.get() var2 = self.variable_b.get() if tkinter.messagebox.askokcancel("Selection", "Confirm selection: " + var1 + ' ' + var2): print(var1, var2) #Or can be other function for further processing root = tk.Tk() app = App(root) app.mainloop() 

Я надеюсь, это поможет вам.

Python - лучший язык программирования в мире.