Получение текста контрольной кнопки из переменной в tkinter - PullRequest
0 голосов
/ 17 июня 2020

Я создаю здесь контрольные кнопки:

var = []
k=0
for i in results:
    var.append(IntVar())
    Checkbutton(frame, text = i[0], variable = var[k], wraplength=500).pack()
    k+=1

Здесь я получил переменную для каждой кнопки проверки и хочу напечатать текст проверенных кнопок:

# function is called when a button is clicked
def delHist():
    for i in range(len(var)):
        if var[i].get()==1:      # checking if the checkbutton is checked
            # want to print the text in the checkbutton here

Как я могу напечатать текст этой контрольной кнопки, используя только переменную?

Изменить: Вопрос здесь кажется похожим: Как получить текст из контрольной кнопки в python? (Tkinter)

Я попытался назначить Checkbutton(frame, text = i[0], variable = var[k], wraplength=500).pack() списку ch[p], чтобы при повторении он был назначен новому объекту. Когда я добавил print ch[p].get() под функцией, я получаю сообщение об ошибке. Я также пробовал print ch[p].get('text'), но получаю сообщение об ошибке

TypeError: "get ()" принимает 1 позиционный аргумент, но дано 2

Ответы [ 3 ]

1 голос
/ 17 июня 2020

Если вы установите onvalue на то же значение, что и текст (или любое другое значение, которое вы хотите), переменная будет либо содержать это значение, либо пустую строку.

Вам нужно сначала переключиться с IntVar на StringVar, а затем установить onvalue и offvalue:

var.append(StringVar())
buttons.append(Checkbutton(tk, text = i[0], variable = var[k], wraplength=500, onvalue=i[0], offvalue=""))

Затем вы можете изменить delHist просто напечатать значения, которые не являются пустой строкой:

def delHist():
    for variable in var:
        value = variable.get()
        if value:
            print(value)
0 голосов
/ 17 июня 2020

Tkinter равно OOP, поэтому имеет место противоположное.
Расширьте объект tk.Checkbutton и забудьте про variable=tk.IntVar().
Расширенный Checkbutton знает свои text= и checked состояние.

enter image description here

import tkinter as tk


class Checkbutton(tk.Checkbutton):
    def __init__(self, parent, **kwargs):
        self._var = tk.IntVar()
        # kwargs['variable'] = self._var
        super().__init__(parent, variable=self._var, **kwargs)

    @property
    def checked(self):
        return self._var.get() == 1

    def __str__(self):
        return f"Checkbutton: {self['text']}={self.checked}"

Использование:

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.frame = tk.Frame(self)
        self.frame.pack()
        for text in ('option 1', 'option 2', 'option 3'):
            Checkbutton(self.frame, text=text, wraplength=500).pack()

        tk.Button(self, text='Show Checkbutton state', command=self.on_button_click).pack()

    def on_button_click(self):
        for ckb in self.frame.children.values():
            print(ckb)

if __name__ == '__main__':
    App().mainloop()

Вывод:

Checkbutton: option 1=False
Checkbutton: option 2=True
Checkbutton: option 3=False
0 голосов
/ 17 июня 2020

Если я правильно понял (поправьте меня в комментариях), вот что вам нужно:

from tkinter import *

tk = Tk()

var = []
buttons = []
k=0
def delHist():
    for i in range(len(var)):
        if var[i].get()==1:
            print(buttons[i]['text'])
for i in 'abcde':
    var.append(IntVar())
    buttons.append(Checkbutton(tk, text = i[0], variable = var[k], wraplength=500))
    buttons[-1].pack()
    k+=1

Button(text='delHist', command=delHist).pack()

Обратите внимание, что я добавляю Checkbutton(...) в список, а не Checkbutton(...).pack(), и запускаю .pack() метод потом. Причина в том, что первый возвращает объект Checkbutton, а второй NoneType - это не jQuery. Надеюсь, это поможет!

...