Tkinter IntVar не работает - PullRequest
0 голосов
/ 11 мая 2018

У меня есть класс мэйнфреймов, а затем класс inforow, который заполняет информацию о кадре построчно, но StringVar и Intvar, похоже, не работают. Они устанавливаются, как показано на распечатке, но кнопка не отражает значение, на которое они устанавливаются. Я сделал более простую версию, которая подчеркивает проблему в этих двух файлах.

Я использую 'Python 2.7.12 (v2.7.12: d33e0cf91556, 27 июня 2016 г., 15:19:22) [MSC v.1500 32 бит (Intel)] на win32'

Когда я запускаю mainframe.py, все кнопки-флажки пусты, но я ожидаю, что они будут сочетанием set и unset.

mainframe.py

from Tkinter import *
import ttk
import inforow

testinfo = {'ITEM 1': {'one':1, 'two':0, 'three':1}
    , 'ITEM 2': {'one':0, 'two':1, 'three':0}}

class MainFrame(Frame):

    def __init__(self, parent=None, **options):
        Frame.__init__(self, parent, **options)
        self.pack(expand=YES, fill=BOTH)
        self.addHeader()
        self.addInfo(testinfo)

    def addHeader(self):
        Label(self, text="Item").grid(row=0,column=0)
        Label(self, text="one").grid(row=0,column=1)
        Label(self, text="two").grid(row=0,column=2)
        Label(self, text="three").grid(row=0,column=3)

    def addInfo(self, info):
        row = 1
        for item in info:
            inforow.InfoRow(self, row, item, info[item])
            row += 1

if __name__ == "__main__": 
    root = Tk()
    MainFrame(root)
    root.mainloop()

и inforow.py

from Tkinter import *
import ttk

class InfoRow():

    def __init__(self, root, row, item, values):
        self.chkUsedVar1 = IntVar()
        self.chkUsedVar1.set(values["one"])
        self.chkUsedVar2 = IntVar()
        self.chkUsedVar2.set(values["two"])
        self.chkUsedVar3 = IntVar()
        self.chkUsedVar3.set(values["three"])


        self.skillLabel = Label(root, width=10, text=item, anchor="w")
        self.skillLabel.grid(row=row,column=0,sticky=W)

        self.usedChkButton1 = Checkbutton(root, text='Used1', variable=self.chkUsedVar1)
        self.usedChkButton1.grid(row=row,column=1)

        self.usedChkButton2 = Checkbutton(root, text='Used2', variable=self.chkUsedVar2)
        self.usedChkButton2.grid(row=row,column=2)

        self.usedChkButton3 = Checkbutton(root, text='Used3', variable=self.chkUsedVar3)
        self.usedChkButton3.grid(row=row,column=3)
        print 'Row ' + item
        print self.chkUsedVar1.get()
        print self.chkUsedVar2.get()
        print self.chkUsedVar3.get()
        print 

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

На ваши IntVar ссылаются только экземпляры вашего класса InfoRow - и вы не сохраняете никаких ссылок на них, поэтому все они сразу же собирают мусор.(Передача переменной в Checkbutton() на самом деле не хранит ссылку на переменную, только ее автоматически сгенерированное имя - PY_VAR0 или что-то еще.)

Если вы завершили эту программу, вам, очевидно, потребуетсяхраните InfoRow где-нибудь, чтобы вы могли получить значения var - и этого было бы достаточно, чтобы исправить кнопки.

0 голосов
/ 11 мая 2018

Это было довольно много кода. Я должен был уменьшить это, чтобы отследить проблему. Я нашел симптом, но не могу точно понять, как это сделать. Это как-то связано с родителем Checkbutton. Изучите мой почти рабочий код:

from tkinter import *

class MainFrame(Frame):
    def __init__(self, parent=None):
        Frame.__init__(self, parent)
        self.pack(expand=YES, fill=BOTH)

        chk = IntVar()
        chk.set(1)
        used1 = Checkbutton(parent, text='Used1', variable=chk)
        used1.pack()
        print(self.winfo_children()[0])

root = Tk()
MainFrame(root)
root.mainloop()

Теперь этот код приводит к проверке Checkbutton, но последняя строка в классе print(self.winfo_children()[0]) генерирует ошибку:

Traceback (most recent call last):
  File "C:\Users\qwerty\Documents\Python\test.py", line 15, in <module>
    MainFrame(root)
  File "C:\Users\qwerty\Documents\Python\test.py", line 12, in __init__
    print(self.winfo_children()[0])
IndexError: list index out of range

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

(я использую Python 3.6.5 под win10)

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