Почему отметка 1 кнопка проверки также помечает вторую?Python Tkinter - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь сделать что-то вроде «таблицы» с изображениями и текстом на одной стороне, и кнопкой проверки рядом с каждой строкой на табеле.таблица должна иметь 2 столбца.то, что я сделал, было создать класс табеля и объединить его в два кадра.проблема в том, что когда я отмечаю кнопку, ее противоположная тоже помечается.

***** отредактировано: ну, я решил это случайно, когда пытался сделать кнопку помеченной, я добавилпометил строку в коде ниже, и это решило, но я не знаю почему.Я буду рад за объяснение (обозначается как **** новый)

изображения:

до:

http://prntscr.com/nbwr3x

после:

http://prntscr.com/nbwr9c

код:

from tkinter import *
from PIL import Image, ImageTk


class Example(Frame):
    def __init__(self, root, side):
        Frame.__init__(self, root)
        self.root = root
        *******new: self.ver_list = [IntVar(value=1) for i in range(1, 202)]
        self.vsb = Scrollbar(self, orient="vertical")
        self.text = Text(self, width=40, height=20,
                            yscrollcommand=self.vsb.set)
        self.im = Image.open("pic.png")
        self.tkimage = ImageTk.PhotoImage(self.im)

        self.vsb.config(command=self.text.yview)
        self.vsb.pack(side="{}".format(RIGHT if side else LEFT), fill="y")
        self.text.pack(side="left", fill="both", expand=True)
        if side:
            for i in range(1, 101):
                cb = Checkbutton(self, text="checkbutton #%s" % i, indicatoron=True, image=self.tkimage, compound=LEFT)
                cb.config(font=("Courier", 15))
                new***:  self.cb.config(variable=self.ver_list[i])
                self.text.window_create("end", window=cb)
                self.text.insert("end", "\n")  # to force one checkbox per line
        else:
            for i in range(101, 201):
                cb = Checkbutton(self, text="checkbutton #%s" % i, indicatoron=True, image=self.tkimage, compound=LEFT)
                cb.config(font=("Courier", 15))
                new***:  self.cb.config(variable=self.ver_list[i])
                self.button_list.append(cb)
                self.text.window_create("end", window=cb)
                self.text.insert("end", "\n")  # to force one checkbox per line


if __name__ == "__main__":
    root = Tk()
    frame1 = Frame(root)
    frame2 = Frame(root)
    Example(frame1, 0).pack(side="top", fill="both", expand=True)
    Example(frame2, 1).pack(side="top", fill="both", expand=True)
    frame1.grid(row=0, column=0)
    frame2.grid(row=0, column=1)
    root.mainloop()

1 Ответ

1 голос
/ 15 апреля 2019

Попробуйте print(cb["variable"]) и в старой версии вы увидите две переменные с одинаковым идентификатором - !checkbutton

То же самое с !checkbutton2, !checkbutton3 и т. Д.

Итакfirst Example() создает локальные переменные с некоторыми именами по умолчанию, но позже second Example() также создает локальные переменные с именами по умолчанию, но он не знает, что эти имена уже существуют.

Таким образом, две кнопки-флажки используют переменные с одинаковыми именами.

В новом коде вы создаете список с 202 IntVar с, и они имеют уникальные идентификаторы, поэтому каждый Checkbutton использует переменную с уникальным идентификатором..

    if side:
        for i in range(1, 101):
            cb = Checkbutton(self, text="checkbutton SIDE #%s" % i, indicatoron=True, compound=LEFT)
            cb.config(variable=self.ver_list[i]) #new***:  

            print(cb["variable"])

            self.text.window_create("end", window=cb)
            self.text.insert("end", "\n")  # to force one checkbox per line
    else:
        for i in range(101, 201):
            cb = Checkbutton(self, text="checkbutton #%s" % i, indicatoron=True, compound=LEFT)
            cb.config(variable=self.ver_list[i])#new***:  

            print(cb["variable"])

            self.text.window_create("end", window=cb)
            self.text.insert("end", "\n")  # to force one checkbox per line
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...