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

Я скопировал Python код для создания окна Tkinter с несколькими фреймами. Я без проблем поместил в него много видов виджетов, но когда я добавляю радиокнопки, они действуют забавно, хотя они отлично работают в обычном окне (без нескольких страниц). Независимо от того, устанавливаю я значение или нет, ни одна из радиокнопок не выбрана. Что еще хуже, если я просто наведу указатель мыши на радиокнопку, похоже, что он будет выбран, хотя я не щелкнул по нему. Если я наведу указатель мыши на обе радиокнопки, они ОБА выглядят выделенными, что нарушает правило выбора одного из многих радиокнопок.

Я должен добавить, что я пробовал это с диспетчером пакетов и с диспетчером сетки . Результаты такие же.

Вот урезанная версия моего кода:

import tkinter as tk

class MainWindow(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        # Set the title of the main window.
        self.title('Multi-frame window')
        # Set the size of the main window to 300x300 pixels.
        self.geometry('300x100')

        # This container contains all the pages.
        container = tk.Frame(self)
        container.grid(row=1, column=1)
        self.frames = {} # These are pages to which we want to navigate.

        # For each page...
        for F in (StartPage, PageOne):
            # ...create the page...
            frame = F(container, self)
            # ...store it in a frame...
            self.frames[F] = frame
            # ..and position the page in the container.
            frame.grid(row=0, column=0, sticky='nsew')

        # The first page is StartPage.
        self.show_frame(StartPage)

    def show_frame(self, name):
        frame = self.frames[name]
        frame.tkraise()

class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text='Start Page')
        label.grid(row=1, column=1)

        # When the user clicks on this button, call the
        #   show_frame method to make PageOne appear.
        button1 = tk.Button(self, text='Visit Page 1',
            command=lambda : controller.show_frame(PageOne))
        button1.grid(row=2, column=1)

class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        # When the user clicks on this button, call the
        #   show_frame method to make StartPage appear.
        button1 = tk.Button(self, text='Back to Start',
            command=lambda : controller.show_frame(StartPage))
        button1.grid(row=1, column=1)
        options_label = tk.Label(self, text='Choose an option: ')
        options_label.grid(row=2, column=1)
        options_value = tk.IntVar()

        first_option = tk.Radiobutton( self , text = 'Option 1' ,
            variable = options_value , value = 1 )
        second_option = tk.Radiobutton( self , text = 'Option 2' ,
            variable = options_value , value = 2 )
        first_option.grid(row=2, column=2)
        second_option.grid(row=2, column=3)
        options_value.set(1)

if __name__ == '__main__':
    app = MainWindow()
    app.mainloop()

1 Ответ

0 голосов
/ 08 мая 2020

Проблема в том, что options_value - это локальное значение, которое уничтожается при завершении __init__.

Вам нужно сохранить ссылку на него, например, self.options_value.

...