本文介绍了更多关于 Python TKinter 动态选项菜单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试修改此处的代码以让用户确认选择的项目从选项菜单.如果用户单击提交"按钮,则会打开一个消息框提示确认.最后,我希望将所选项目作为变量返回给程序,以便它们可以在其他函数中使用以进行进一步处理.但是,我的修改不起作用;它只是返回一个空窗口.对我缺少什么的想法?非常感谢.

I'm trying to modify the code here to have the user confirm the items selected from the optionmenus. If the user clicks on the Submit button, a message box should open prompting confirmation. Finally, I want the selected items to be returned to the program as variables so they can be used in other functions for further processing. However, my modification is not working; it just returns an empty window. Thoughts on what I am missing? Many thanks.

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 版

窗口现在与小部件一起出现.我在按钮前面省略了 self. .我仍然收到一条我正在尝试解决的错误消息:AttributeError: 'App' object has no attribute 'optionmenu_b'

The window now appears with the widgets. I had omitted self. in front of the button. I still get an error message which I am trying to sort out: AttributeError: 'App' object has no attribute 'optionmenu_b'

推荐答案

在这里@sedeh,这可以按您的意愿工作.错误不是来自您的附加组件,但我认为使用 from tkinter import * 而不是 import tkinter as tk,这就是运行代码时出现错误的原因一旦 tk 窗口出现.

Here @sedeh, this works as you wanted it to. The error came not from your add ons, but I think from using from tkinter import * instead of import tkinter as tk, this is why when running your code the error comes up as soon as the tk window comes up.

我所做的是从您提供的链接中获取代码,添加您所做的并且没有错误.

What I have done is taken the code from the link you gave, added what you did and it works with no error.

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 TKinter 动态选项菜单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-29 16:32
查看更多