Автоматизировать создание произвольного имени функции с помощью строковых манипуляций в команде подменю tkinter - PullRequest
1 голос
/ 18 июня 2020

Я создал окно 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

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