1

我正在尝试使用包含单选按钮的 tkinter 实现一个菜单,但在单击其中一个选项之前我无法选择其中一个选项。当 GUI 出现时,没有选择任何单选按钮,而是我希望选择第二个选项。这是我的代码:

menubar = Menu(root)
# create a pulldown menu, and add it to the menu bar
settings = Menu(menubar, tearoff=0)
settings.add_command(label='some 1', command=some_1)
settings.add_command(label='some 2', command=some_2)
mDebug = Menu(settings, tearoff=0)
rvar = IntVar(root)   
rvar.set(1) 
mDebug.add_radiobutton(label='first', var = rvar, value = 0)
mDebug.add_radiobutton(label='second', var = rvar, value = 1) 
mDebug.add_radiobutton(label='third', var = rvar, value = 2)

settings.add_cascade(label='radio options', menu = mDebug)
settings.add_separator()
settings.add_command(label='quit', command=close)
menubar.add_cascade(label="Menu", menu=settings)
root.config(menu=menubar)

编辑:这是代码的更完整版本:

from tkinter import *


def change(idx):
    print(idx)

def show_menu(root):
    menubar = Menu(root)
    settings = Menu(menubar, tearoff=0)
    settings.add_command(label='some 1')
    settings.add_command(label='some 2')
    mDebug = Menu(settings, tearoff=0)
    rvar = IntVar(root)   
    rvar.set(1) 
    mDebug.add_radiobutton(label='first', var = rvar, value = 0, command=lambda idx=0: change(idx))
    mDebug.add_radiobutton(label='second', var = rvar, value = 1, command=lambda idx=1: change(idx)) 
    mDebug.add_radiobutton(label='third', var = rvar, value = 2, command=lambda idx=2: change(idx))

    settings.add_cascade(label='radio options', menu = mDebug)
    settings.add_separator()
    settings.add_command(label='quit')
    menubar.add_cascade(label="Menu", menu=settings)
    root.config(menu=menubar)

root = Tk() 

show_menu(root)

root.mainloop()
4

2 回答 2

0

问题是这rvar是一个局部变量。当函数超出范围时,python 的垃圾收集过程将销毁该对象。

您需要保存对变量的引用。例如,self.rvar

于 2020-05-03T19:00:34.927 回答
0
# import tkinter as tk
from tkinter import *

# root = Tk()
# rvar = IntVar(root)
# rvar.set(1)

def change(idx):
    print(idx)

def show_menu(root):
    # global rvar
    try:
        show_menu.rvar
    except:
        show_menu.rvar = IntVar(root)
        show_menu.rvar.set(1)

    menubar = Menu(root)
    settings = Menu(menubar, tearoff=0)
    settings.add_command(label='some 1')
    settings.add_command(label='some 2')
    mDebug = Menu(settings, tearoff=0)

    mDebug.add_radiobutton(label='first', var = show_menu.rvar, value = 0, command=lambda idx=0: change(idx))
    mDebug.add_radiobutton(label='second', var = show_menu.rvar, value = 1, command=lambda idx=1: change(idx))
    mDebug.add_radiobutton(label='third', var = show_menu.rvar, value = 2, command=lambda idx=2: change(idx))

    settings.add_cascade(label='radio options', menu = mDebug)
    settings.add_separator()
    settings.add_command(label='quit')
    menubar.add_cascade(label="Menu", menu=settings)
    root.config(menu=menubar)

root = Tk()
show_menu(root)

root.mainloop()

这有效,至少在我的 Win10 py36 设置中有效。正如另一位评论者指出的那样,在类中引入全局或使用 self.rvar 也应该起作用。

于 2021-05-23T14:02:26.700 回答