#python #tkinter
Вопрос:
Допустим, у меня есть меню опций 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, потому что такой вещи, как a
ListVar
, не существует .
Комментарии:
1. Как насчет того, чтобы сделать его объектной переменной?
Ответ №1:
Я изменил ваш сценарий, чтобы продемонстрировать, как это сделать:
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 будут вставлены.
Комментарии:
1. Спасибо! Есть ли у каждого виджета Tkinter
.keys()
?help(network_select['menu'])
это то, что мне было нужно!
Ответ №2:
То же самое, но с 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()
Ответ №3:
В случае использования ttk на объекте OptionMenu есть удобный set_menu(default=None, values)
способ.