16

network_select接続するネットワークのリストを含むオプション メニューがあるとします。

import Tkinter as tk

choices = ('network one', 'network two', 'network three')
var = tk.StringVar(root)
network_select = tk.OptionMenu(root, var, *choices)

ここで、ユーザーが更新ボタンを押したときに、ユーザーが接続できるネットワークのリストを更新したいと考えています。

  • 調べてみたところ、私が与えた選択肢のように見えるエントリが見当たらなかった.configため、使用できません。network_select.config()
  • これは tk 変数を使用して変更できるものではないと思いますListVar
4

3 に答える 3

42

これを行う方法を示すためにスクリプトを変更しました。

import Tkinter as tk

root = tk.Tk()
choices = ('network one', 'network two', 'network three')
var = tk.StringVar(root)

def refresh():
    # Reset var and delete all old options
    var.set('')
    network_select['menu'].delete(0, 'end')

    # Insert list of new options (tk._setit hooks them up to var)
    new_choices = ('one', 'two', 'three')
    for choice in new_choices:
        network_select['menu'].add_command(label=choice, command=tk._setit(var, choice))

network_select = tk.OptionMenu(root, var, *choices)
network_select.grid()

# I made this quick refresh button to demonstrate
tk.Button(root, text='Refresh', command=refresh).grid()

root.mainloop()

[更新] ボタンをクリックするとすぐに、network_select のオプションがクリアされ、new_choices のオプションが挿入されます。

于 2013-07-10T21:39:44.620 に答える
1

同じですが、tk.Menuウィジェットを使用します。

# Using lambda keyword and refresh function to create a dynamic menu.
import tkinter as tk

def show(x):
    """ Show menu items """
    var.set(x)

def refresh(l):
    """ Refresh menu contents """
    var.set('')
    menu.delete(0, 'end')
    for i in l:
        menu.add_command(label=i, command=lambda x=i: show(x))

root = tk.Tk()
menubar = tk.Menu(root)
root.configure(menu=menubar)
menu = tk.Menu(menubar, tearoff=False)
menubar.add_cascade(label='Choice', menu=menu)

var = tk.StringVar()
l = ['one', 'two', 'three']
refresh(l)
l = ['four', 'five', 'six', 'seven']
tk.Button(root, text='Refresh', command=lambda: refresh(l)).pack()
tk.Label(root, textvariable=var).pack()
root.mainloop()
于 2017-12-14T12:24:13.983 に答える