【问题标题】:Quitting Tkinter drop down menu退出 Tkinter 下拉菜单
【发布时间】:2017-08-13 11:29:41
【问题描述】:

我有一个下拉菜单,希望它必须选择注销。选择注销时我需要关闭菜单,但我不希望整个程序关闭。

我尝试过 root.quit() 之类的方法,但它说 root 没有定义,即使它是。关闭菜单的最佳方法是什么。菜单的代码是:

from tkinter import *

def edit_or_retrieve():

    root = Tk()
    root.title("Main Menu")

    menu = Frame(root)
    menu.pack(pady = 5, padx = 50)
    var = StringVar(root)

    options = [
        'Enter',
        'Edit', 
        'Retrieve',
        'Report 1 - Dates of birth',
        'Report 2 - Home phone numbers',
        'Report 3 - Home addresses',
        'Log off',

]
    option = OptionMenu(menu, var, options[0], *options, command=function)

    var.set('Select')

    option.grid(row = 1, column = 1)

    root.mainloop()



def function(value):
    if value == 'Edit':
        edit()
    if value == 'Enter':
        enter()
    if value == 'Retrieve':
        display()
    if value == 'Report 1 - Dates of birth':
         reportone()
    if value == 'Report 2 - Home phone numbers':
         reporttwo()
    if value == 'Report 3 - Home addresses':
         reportthree()
    if value == 'Log off':
         #this is where the command or function name needs to go,  
         #however I am not sure what it should be.

【问题讨论】:

  • 根变量只有函数scope

标签: python python-3.x drop-down-menu tkinter tk


【解决方案1】:

function() 中调用root.quit() 的问题是因为它是edit_or_retrieve() 函数的局部变量。这可以通过将其作为参数传递给 function() 来解决,但不幸的是,OptionMenu 小部件就是这样做的,您无法修改它。

但是,您可以通过创建一个短的lambda 函数来解决此问题并将额外的参数传递给函数,该函数充当软件"shim",并在调用时将额外的参数传递给function() .

以下是您的代码,经过修改:

from tkinter import *

def edit_or_retrieve():
    root = Tk()
    root.title("Main Menu")

    menu = Frame(root)
    menu.pack(pady=5, padx=50)
    var = StringVar(root)

    options = ['Enter',
               'Edit',
               'Retrieve',
               'Report 1 - Dates of birth',
               'Report 2 - Home phone numbers',
               'Report 3 - Home addresses',
               'Log off',]

    option = OptionMenu(menu, var, *options,
                        # use lambda to pass local var as extra argument
                        command=lambda x: function(x, root))

    var.set('Select')
    option.grid(row=1, column=1)

    root.mainloop()

def function(value, root):  # note added "root" argument
    if value == 'Edit':
        edit()
    if value == 'Enter':
        enter()
    if value == 'Retrieve':
        display()
    if value == 'Report 1 - Dates of birth':
         reportone()
    if value == 'Report 2 - Home phone numbers':
         reporttwo()
    if value == 'Report 3 - Home addresses':
         reportthree()
    if value == 'Log off':
        root.quit()

edit_or_retrieve()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-05-18
  • 2012-12-08
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多