Ткинтер, радиопереключатель странного вида - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь создать набор Radiobutton, используя класс, но все кнопки проверяются в начале

Когда я пытался ввести переменную для Radiobutton на этапе ее создания, я получил ошибкусообщение.

from tkinter import *

SubTests = ['Test 1', 'Test 2', 'Test 3', 'Test 4', 'Test 5', 'Test 6', 'Test 7', 'Test 8', 'Test 9', 'Test 10']

class GUI:
    def __init__(self, master=NONE):
        self.master = master
        rb = [NONE]*len(SubTests)
        for i in range(len(SubTests)):
        rb[i] = Radiobutton(master, text=SubTests[i], fg='black', value=i)
        rb[i].grid(column=0, row=(2 + i), sticky=W, padx=5)

root = Tk()
root.geometry('940x550')
root.resizable(FALSE,FALSE)
root.title("GUI Template")

display = GUI(root)

root.mainloop()

Должны появиться значения Radiobutton s Test1, Test2, ..., Test10, но вместо них все они отмечены.

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Вот как настроить кнопки, а также переменную IntVar, которую я назвал choice, для хранения значения, соответствующего Radiobutton, который в данный момент «вставлен» (если есть). Я также сделал это и атрибуты списка rb экземпляра класса GUI, поставив перед ними префикс self.. Это позволит ссылаться на них из других методов класса, поскольку все методы автоматически передаются self в качестве первого аргумента.

Чтобы продемонстрировать, как можно использовать эти атрибуты экземпляра, код также используетcommand= опция, которая Radiobutton s должна указывать функцию "обратного вызова", которая будет вызываться каждый раз, когда пользователь меняет свое состояние.

from tkinter import *

SubTests = ['Test 1', 'Test 2', 'Test 3', 'Test 4', 'Test 5', 'Test 6', 'Test 7',
            'Test 8', 'Test 9', 'Test 10']

class GUI:
    def __init__(self, master=None):
        self.master = master
        self.choice = IntVar(value=-1)  # Set to a value no button will produce.
        self.rb = []
        for i, subtest in enumerate(SubTests):
            radio_btn = Radiobutton(master, text=subtest, fg='black', value=i,
                                    variable=self.choice, command=self.btn_callback)
            radio_btn.grid(column=0, row=i+2, sticky=W, padx=5)
            self.rb.append(radio_btn)

    def btn_callback(self):
        choosen = self.choice.get()  # Index of button pressed.
        subtest = self.rb[choosen].cget('text')  # Button's text.
        print('You chose: {}'.format(subtest))


root = Tk()
root.geometry('940x550')
root.resizable(FALSE, FALSE)
root.title("GUI Template")

display = GUI(root)

root.mainloop()
0 голосов
/ 08 ноября 2019

Радиобрелкам необходимо установить атрибут variable для экземпляра одного из переменных объектов tkinter (IntVar, StringVar и т. Д.). Tkinter использует тот факт, что несколько радиокнопок совместно используют одну и ту же переменную, чтобы дать им эксклюзивное поведение при выборе.

Поскольку вы используете целочисленные значения, вы можете использовать IntVar. Вам нужно создать эту переменную вне цикла и использовать ее внутри цикла. Следующий код создает одну переменную (self.var) и связывает ее с каждой радиокнопкой (variable=self.var)

class GUI:
    def __init__(self, master=NONE):
        self.master = master
        self.var = IntVar(value=0)
        rb = [NONE]*len(SubTests)
        for i in range(len(SubTests)):
            rb[i] = Radiobutton(master, text=SubTests[i], fg='black',
                                value=i, variable=self.var)
            rb[i].grid(column=0, row=(2 + i), sticky=W, padx=5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...