Почему я не могу передать переменную Radiobutton из одного класса в другой класс с помощью Tkinter? - PullRequest
1 голос
/ 18 апреля 2020

Позвольте мне начать с того, что я обнаружил переполнение стека и не смог найти ответ на свой вопрос. Я нашел что-то очень близкое, но все еще не могу решить свою проблему. Если вам известна ссылка, которая будет полезна, пожалуйста, включите ее в комментарии.

Я относительно новичок в программировании в 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 выбранную переменную переключателя из предыдущего класса. Вместо этого все, что я получаю, это «Вы выбрали в качестве своих эмоций». Все, что я хотел бы сделать, это передать переменную переключателя из предыдущего класса в этот класс без каких-либо ошибок.

Если у кого-то есть понимание того, как решить эту проблему, это будет с благодарностью. Спасибо!

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