Tkinter OptionMenu отключен, но расширяемый - PullRequest
1 голос
/ 18 апреля 2019

Есть ли какое-либо решение защиты от записи tkinter OptionMenu, при этом сохраняя возможность проверки доступных опций?

Справочная информация: у меня есть tkinter OptionMenu, содержащий выбор файлов, которые пользователь может "быстро загрузить" в приложение. Однако может случиться так, что у пользователя нет прав на загрузку новых файлов.

Теперь я указываю это, переводя OptionMenu в disabled состояние. Но тогда раскрывающийся список больше не может быть расширен; это означает, что пользователь не может просматривать доступные файлы.

Ответы [ 2 ]

2 голосов
/ 18 апреля 2019

Да, можно отключить меню и по-прежнему открывать его, чтобы увидеть список.Меню, используемое в OptionMenu - это tkinter Menu(), и вы можете получить к нему доступ.

Пример:

Op = OptionMenu(root, var, 'First', 'Second', 'Third')
Op.pack()

# Op_Menu is the Menu() class used for OptionMenu
Op_Menu = Op['menu']

Затем вы можете сделать что-нибудь с помощью Op меню такое же как Menu()


В вашем случае, как отключить?

Мы можем использовать menu.entryconfig(index, options) для настройки state = 'disabled' / 'normal' в соответствии с пользователем.

Пример:

import tkinter as tk

root = tk.Tk()
root.geometry('250x250+100+100')

str = tk.StringVar()
str.set('Select')

Op = tk.OptionMenu(root, str, "First", "Second", "Third")
Op.pack()


# This will disable the First and Third entries in the Op
# state = 'disable' / 'normal'
Op['menu'].entryconfig(0, state='disable')
Op['menu'].entryconfig("Third", state='disable')


entries = Op['menu'].index('end')     # This will get the total no. of entries.

# If you want to disable all of the entries uncomment below 2 lines.

# for i in range(entries+1):
#     Op['menu'].entryconfig(i, state='disable')


root.mainloop()

https://i.stack.imgur.com/0Dxmj.png

Для лучшего понимания того, как Menu() определяется внутри OptionMenu класса, можно проверитьисходный код OptionMenu() класса . (из строки 3959 )

2 голосов
/ 18 апреля 2019

Вы можете отключить каждую запись меню вместо полного отключения опции меню, используя menu.entryconfigure(<index>, state='disabled').Меню опционного меню хранится в свойстве menu:

import tkinter as tk
root = tk.Tk()
var = tk.StringVar(root)
opmenu = tk.OptionMenu(root, var, *['item %i' % i for i in range(5)])
opmenu.pack()
menu = opmenu['menu']
for i in range(menu.index('end') + 1):
    menu.entryconfigure(i, state='disabled')

Таким образом, вы можете просматривать все элементы в меню, но они не активируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...