У меня есть два файла: `bottom_menu.py` и `right_menu.py`, где я создаю класс `RightMenu`. В этом классе, например, есть чекбокс. Я реализую метод `get_effects(self)`, который использует метод `get` для получения значения чекбокса. Когда я вызываю этот метод в файле `right_menu.py`, он корректно возвращает текущее состояние чекбокса.
Однако, когда я импортирую класс `RightMenu` в файл `bottom_menu.py`, создаю его экземпляр и пытаюсь вызвать метод `get_effects()` через этот экземпляр, метод работает, но всегда возвращает 0, независимо от состояния чекбокса.
Вот как выглядят соответствующие части кода:
```python
class RightMenu(ctk.CTkFrame):
def __init__(self, master, *args, **kwargs):
super().__init__(master, *args, **kwargs)
self.right_menu = ctk.CTkFrame(self, width=200, corner_radius=0, border_color="#242323", border_width=1)
self.right_menu.pack(side="right", fill="y", expand=False)
self.checkbox = ctk.CTkCheckBox(self.right_menu, text="Contrast", width=100, height=25, command=self.toggle_slider)
self.checkbox.pack(padx=10, pady=10, anchor="w")
def get_effects(self):
contrast = self.checkbox.get()
print(contrast)
return contrast
```
И вот часть кода из файла `bottom_menu.py`:
```python
class BottomMenu(ctk.CTkFrame):
def __init__(self, master=None, start_video_callback=None, stop_video_callback=None):
super().__init__(master=master, corner_radius=0, height=100, border_color="#242323", border_width=1)
self.right_menu = RightMenu(self)
def on_apply_changes_click(self):
# Получаем значение слайдера контраста из RightMenu
checkbox_value = self.right_menu.get_effects()
print(f"Чекбокс значение: {checkbox_value}")
```
Почему метод `get_effects()` возвращает 0, когда я вызываю его через экземпляр класса `BottomMenu`, даже если чекбокс имеет значение 1?
Судя по вашему описанию, кажется, что проблема заключается в том, как вы используете и инициализируете класс `RightMenu`. Чекбокс может не обновляться должным образом. Давайте посмотрим на некоторые возможные причины и как это можно исправить.
### Одной из возможных причин может быть порядок инициализации виджетов:
Когда вы создаете экземпляр `RightMenu` в `BottomMenu`, вам нужно убедиться, что он правильно отображается на экране и что состояние чекбокса обновляется в реальном времени. Убедитесь, что после создания экземпляра `RightMenu` он добавлен на экран и отображается. Возможно, вы забыли вызвать метод `pack()` или другие настройки для отображения виджетов.
### Попробуйте выполнить следующее:
1. Убедитесь, что вы добавили `RightMenu` в `BottomMenu` с помощью метода `pack` или `grid`:
```python
class BottomMenu(ctk.CTkFrame):
def __init__(self, master=None, start_video_callback=None, stop_video_callback=None):
super().__init__(master=master, corner_radius=0, height=100, border_color="#242323", border_width=1)
self.right_menu = RightMenu(self)
self.right_menu.pack(side="right", fill="y") # добавьте pack или grid для отображения
```
2. Проверьте, нет ли других частей кода, которые могут сбрасывать состояние чекбокса или переинициализировать `RightMenu`.
3. Убедитесь, что вы вызываете `get_effects()` после того, как пользователь взаимодействует с чекбоксом. Например, необходимо вызывать этот метод в ответ на событие, например, по нажатию кнопки:
```python
class BottomMenu(ctk.CTkFrame):
def __init__(self, master=None, start_video_callback=None, stop_video_callback=None):
super().__init__(master=master, corner_radius=0, height=100, border_color="#242323", border_width=1)
self.right_menu = RightMenu(self)
self.right_menu.pack(side="right", fill="y")
# Например, создайте кнопку, которая вызывает on_apply_changes_click при нажатии
apply_button = ctk.CTkButton(self, text="Apply Changes", command=self.on_apply_changes_click)
apply_button.pack(pady=10)
def on_apply_changes_click(self):
checkbox_value = self.right_menu.get_effects()
print(f"Чекбокс значение: {checkbox_value}")
```
### Если все эти моменты учтены:
Если все вышеперечисленные шаги выполнены, и чекбокс по-прежнему не работает правильно, попробуйте добавить отладочные сообщения, чтобы понять, когда именно вызывается метод `get_effects()` и какая версия состояния чекбокса у него в этот момент.
Таким образом, вы сможете более точно установить, в чем заключается проблема.
В следующем коде 3 файла мои и все нормально работает.
когда чек бокс выбран будет 1 а когда чек бокс не выбран то будет 0
сохрани все эти файлы рядом по именам чтобы все файлы были рядом и формате UTF-8
# main.py import customtkinter as ctk from right_menu import RightMenu from bottom_menu import BottomMenu def main(): root = ctk.CTk() root.geometry("600x400") root.title("Demo передачи значения между меню") right = RightMenu(root) right.pack(side="right", fill="y") bottom = BottomMenu(root, right_menu=right) bottom.pack(side="bottom", fill="x") root.mainloop() if __name__ == "__main__": main()
# right_menu.py import customtkinter as ctk class RightMenu(ctk.CTkFrame): def __init__(self, master, **kwargs): super().__init__(master, **kwargs) self.right_menu = ctk.CTkFrame(self, width=200, corner_radius=0, border_color="#242323", border_width=1) self.right_menu.pack(side="right", fill="y") self.checkbox = ctk.CTkCheckBox( self.right_menu, text="Contrast", width=100, height=25, command=self.toggle_slider ) self.checkbox.pack(padx=10, pady=10, anchor="w") def toggle_slider(self): print("Checkbox toggled, now:", self.checkbox.get()) def get_effects(self): """ Возвращает текущее состояние чекбокса: 1 — включён; 0 — выключен. """ return self.checkbox.get()
# bottom_menu.py import customtkinter as ctk class BottomMenu(ctk.CTkFrame): def __init__(self, master, right_menu, **kwargs): super().__init__(master, corner_radius=0, height=100, border_color="#242323", border_width=1, **kwargs) self.right_menu = right_menu apply_btn = ctk.CTkButton( self, text="Применить", command=self.on_apply_changes_click ) apply_btn.pack(padx=10, pady=10, anchor="e") def on_apply_changes_click(self): checkbox_value = self.right_menu.get_effects() print(f"Текущее состояние чекбокса Contrast: {checkbox_value}")