Я создал окно root с помощью tkinter, с меню (Файл, Материал) и следующим подменю для Файла (Новый, Открыть, и т. c) и Материала (Добавить, Изменить). Чтобы уменьшить повторяемость, чтобы вызвать команду подменю (Файл - Новый), я попробовал следующий код. Я знаю, что странно, я пытаюсь создать переменную, назначенную команде подменю, строкового типа (так как я сделал это из комбинации Menu-Submenu, сделал ее строчными буквами и заменил все пробелы). Распечатав его (я использую x, print (x) is file_new, что должно соответствовать аналогичному имени file_new). Но это не сработало, кажется, что python / tkinter игнорирует / ничего не происходит. Пожалуйста, сообщите, можно ли это сделать в python (я ожидаю его знаменитой гибкости). Мой код ниже
""" Create window with menu """
from tkinter import Tk, Menu, BOTTOM, X
from tkinter.ttk import Label
from tkinter.messagebox import showerror
window = Tk()
window.title('Thermolator')
window.geometry('640x480')
window.resizable('False', 'False')
menus = ('File', 'Material')
file_fields = ('New', 'Open', 'Save', 'Save As', 'Close')
material_fields = ('Add', 'Edit')
def statusbar(text=''):
Label(window, text=text, anchor='w').pack(side=BOTTOM, fill=X)
def not_yet():
showerror('Not Implemented', 'Not yet available')
def file_new():
statusbar('New file!')
def file_open():
statusbar('Open existing file!')
def file_save():
statusbar('Save file!')
def file_saveas():
statusbar('Save file as ...')
def file_close():
statusbar('Close file!')
top = Menu(window)
window.config(menu=top)
# create menu and sub-menu with its command
for index, item in enumerate(menus):
menu = Menu(top, tearoff=False)
top.add_cascade(label=item, menu=menu, underline=0)
if index == 0:
for field in file_fields:
x = (item + '_' + field).lower().replace(' ' , '')
menu.add_command(label=field, command = x , underline=0)
print(x)
else:
for field in material_fields:
menu.add_command(label=field, command=not_yet, underline=0)
window.mainloop()
"""
print(x) above give these:
file_new
file_open
file_save
file_saveas
file_close
"""