Позвольте мне начать с того, что я обнаружил переполнение стека и не смог найти ответ на свой вопрос. Я нашел что-то очень близкое, но все еще не могу решить свою проблему. Если вам известна ссылка, которая будет полезна, пожалуйста, включите ее в комментарии.
Я относительно новичок в программировании в Python, поэтому, пожалуйста, предоставьте конструктивную критику, если вы видите какие-либо неправильные методы программирования или если что-то может быть запрограммирован в стиле Pythoni c.
У меня проблема с получением переменной из переключателя в одном классе и распечаткой ее в метке на другом кадре в другом классе. К вашему сведению: На данный момент все классы находятся в одном файле, но я планирую изменить это после завершения программы.
Вот мой класс контроллера:
import tkinter as tk
from tkinter import ttk
class MainWindow(tk.Tk):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.emotion_list = ["angry", "sad", "happy", "fearful", "surprised", "curious",
"anxious", "chill"]
self.title("Application")
self.frames = {}
inner_container = ttk.Frame(self)
inner_container.grid(sticky='ew')
for FrameClass in (ChooseFeelings, ChooseState):
frame = FrameClass(inner_container, self, self.pages)
self.frames[FrameClass] = frame
frame.grid(row=0, column=0, sticky='nsew')
self.show_frame(ChooseFeelings)
def show_frame(self, inner_container):
frame = self.frames[inner_container]
frame.tkraise()
def get_frame(self, classname):
"""Returns an instance of a frame given its class name as a string"""
for page in self.frames.values():
if str(page.__class__.__name__) == classname:
return page
return None
Как вы можете видите, я включил метод внизу моего класса контроллера, который может быть вызван для создания экземпляра любого класса при необходимости.
Я также не включил все классы в словарь self.frames, потому что они не Это не относится к данной проблеме.
Здесь у меня есть класс, который отображает переключатели для пользователя. Я хорошо знаю, что, как это выглядит сейчас, они не организованы в кадре. В кадре есть другие виджеты, которые я пропускаю в классе, потому что они не имеют отношения к проблеме.
class ChooseFeelings(ttk.Frame):
def __init__(self, container, controller, **kwargs):
super().__init__(container, **kwargs)
emotion_container = ttk.Frame(self, padding='100 15 30 15')
emotion_container.grid(sticky='ew')
self.controller = controller
self.selected_emotion = tk.StringVar()
move_on_button = ttk.Button(emotion_container, text="Click me when you are ready to move on",
command=lambda: [controller.show_frame(ChooseState), print(selected_emotion.get())])
move_on_button.pack(side='top')
for emotions in self.controller.emotion_list:
ttk.Radiobutton(emotion_container, text=emotions, variable=self.selected_emotion,
value=emotions).pack(side='bottom')
После нажатия кнопки move_on_, я распечатываю на консоль переменную, которую я надеюсь получить в метке на следующем кадре.
Вот кадр, в который переменная должна выводиться пользователю.
class ChooseState(ttk.Frame):
def __init__(self, container, controller, **kwargs):
super().__init__(container, **kwargs)
self.controller = controller
state_container = ttk.Frame(self, padding='100 15 30 15')
state_container.grid(sticky='ew')
self.emotion_label = ttk.Label(state_container, text=f"You chose {self.get_feels()} as your emotion.")
self.emotion_label.grid(row=0, column=0, sticky='w')
def get_feels(self):
feelings_frame = self.controller.get_frame("ChooseFeelings")
user_emotion = feelings_frame.selected_emotion.get()
return user_emotion
root = MainWindow()
root.mainloop()
Как видите, метод get_feels используется для создания экземпляра класса ChooseFeelings, затем переменная 'user_emotion' должна содержать выбранную переменную переключателя. Как только это происходит, возвращается переменная 'user_emotion', которая должна быть выведена на экран. Или так я подумал ....
В классе ChooseState я должен распечатать в self.emotion_label выбранную переменную переключателя из предыдущего класса. Вместо этого все, что я получаю, это «Вы выбрали в качестве своих эмоций». Все, что я хотел бы сделать, это передать переменную переключателя из предыдущего класса в этот класс без каких-либо ошибок.
Если у кого-то есть понимание того, как решить эту проблему, это будет с благодарностью. Спасибо!