Вы отправляете значение из глобальной переменной transformEnabled
в функцию, но для строки / int / float / boolean Python не сохраняет ссылку на исходную переменную, но копирует значения в новую переменную.
Вы можете использовать global transformEnabled
в функции и изменять напрямую transformEnabled = True
, чтобы присвоить значение глобальной переменной. Но ваш комплекс слишком код для этого простого метода.
В вашем коде лучше хранить значения в глобальном словаре и отправлять строки "transform"
, "selection"
, "paint"
и использовать их для доступа к данным в этом глобальном словаре.
Это это большие изменения в коде, но вам это нужно. В конце концов вы можете попытаться использовать классы для создания виджета, который хранит кнопки и значения для одного типа функций. Вы также можете использовать Frame
для группировки кнопок и показать / скрыть этот кадр.
Я изменил другие вещи в коде - на основе PEP 8 - Руководство по стилю для Python Код
import tkinter as tk
# --- functions --- (lower_case_names)
def hide(toolkit):
for item in toolkit:
item.grid_forget()
def show(toolkit):
for i, item in enumerate(toolkit):
item.grid(row=i+4, column=0) # maybe len(settings) instead of `4` so it will be works when you add more data in dictionary.
def on_click(name):
print('--- before ---')
for key, value in settings.items():
print('{} enabled: {}'.format(key, value['enabled']))
print('--- changes ---')
if not settings[name]['enabled']:
# hide other buttons
for key, value in settings.items():
print("Check:", key, key != name, value['enabled'])
if key != name and value['enabled']:
hide(value['buttons'])
value['enabled'] = False
# show buttons for `name`
print("Show:", name)
show(settings[name]['buttons'])
settings[name]['enabled'] = True
else:
# hide buttons for `name`
print("Hide:", name)
hide(settings[name]['buttons'])
settings[name]['enabled'] = False
# --- main --- (lower_case_names)
settings = {
'transform': {
'enabled': False,
'names': ["Scale Image", "Rotate Image", "Move Image", "Flip Image", "Sharpen/Soften Image", "Brightness/Constrast"],
'buttons': [],
},
'selection': {
'enabled': False,
'names': ["Regular Shape Selection", "Free hand Tool", "Colour Picker"],
'buttons': [],
},
'paint': {
'enabled': False,
'names': ["Paintbrush", "Airbrush", "Pencil", "Eraser", "Fill", "Smudge", "Dodge and Burn"],
'buttons': [],
},
}
root = tk.Tk()
settings['transform']['buttons'] = [tk.Button(root, text=item, width=20) for item in settings['transform']['names']]
# Selection Buttons
settings['selection']['buttons'] = [tk.Button(root, text=item, width=20) for item in settings['selection']['names']]
# Paint Buttons
settings['paint']['buttons'] = [tk.Button(root, text=item, width=20) for item in settings['paint']['names']]
transform = tk.Button(root, text="Transform Tools", width=20, command=lambda:on_click('transform'))
transform.grid(row=3, column=0)
selection = tk.Button(root, text="Selection Tools", width=20, command=lambda:on_click('selection'))
selection.grid(row=2, column=0)
paint = tk.Button(root, text="Paint Tools", width=20, command=lambda:on_click('paint'))
paint.grid(row=1, column=0)
root.mainloop()
РЕДАКТИРОВАТЬ: Тот же код, но кнопки создаются с помощью l oop. И я использую len(settings)
вместо 4
для удаления кнопок - таким образом я мог бы добавить Help
меню в словарь без изменения другого кода.
import tkinter as tk
# --- functions --- (lower_case_names)
def hide(toolkit):
for item in toolkit:
item.grid_forget()
def show(toolkit):
for i, item in enumerate(toolkit):
item.grid(row=i+len(settings), column=0)
def on_click(name):
print('--- before ---')
for key, value in settings.items():
print('{} enabled: {}'.format(key, value['enabled']))
print('--- changes ---')
if not settings[name]['enabled']:
# hide other buttons
for key, value in settings.items():
print("Check:", key, key != name, value['enabled'])
if key != name and value['enabled']:
hide(value['buttons'])
value['enabled'] = False
# show buttons for `name`
print("Show:", name)
show(settings[name]['buttons'])
settings[name]['enabled'] = True
else:
# hide buttons for `name`
print("Hide:", name)
hide(settings[name]['buttons'])
settings[name]['enabled'] = False
# --- main --- (lower_case_names)
settings = {
'transform': {
'title': "Transform Tools",
'enabled': False,
'names': ["Scale Image", "Rotate Image", "Move Image", "Flip Image", "Sharpen/Soften Image", "Brightness/Constrast"],
'buttons': [],
},
'selection': {
'title': "Selection Tools",
'enabled': False,
'names': ["Regular Shape Selection", "Free hand Tool", "Colour Picker"],
'buttons': [],
},
'paint': {
'title': "Paint Tools",
'enabled': False,
'names': ["Paintbrush", "Airbrush", "Pencil", "Eraser", "Fill", "Smudge", "Dodge and Burn"],
'buttons': [],
},
'help': {
'title': "Help",
'enabled': False,
'names': ["Help ...", "Home Page", "About"],
'buttons': [],
},
}
root = tk.Tk()
for i, name in enumerate(['paint', 'selection', 'transform', 'help']): # it could be `enumerate(settings.keys())` but sometimes it may not keep order.
settings[name]['buttons'] = [tk.Button(root, text=item, width=20) for item in settings[name]['names']]
button = tk.Button(root, text=settings[name]['title'], width=20, command=lambda arg=name:on_click(arg))
button.grid(row=i, column=0)
root.mainloop()