текстовая переменная метки tkinter не отображается - PullRequest
0 голосов
/ 17 июня 2020

Я использую python 3.7 и tkinter.

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

Я понимаю, что конструкция моей «таблицы», подобной GUI, не так проста, как могла бы быть. Я хочу иметь возможность легко скрывать / отображать строки, поэтому я дал каждой строке отдельный фрейм, что упрощает отображение / скрытие любой строки. (Я также использовал макет сетки в каждой строке, думая, что это будет самый простой способ в конечном итоге заставить диспетчер геометрии дать мне одинаковую / неизменную ширину ячеек.)

Моя первая проблема - это что в моих ярлыках в «таблице» нет текста. Я подтвердил через print('label text = ', label.cget("textvariable")), что метке была назначена правильная текстовая переменная.

Я прочитал много сообщений о том, что текст метки tkinter не отображается, и ничего не помогло. Спасибо за любые идеи. Вот код:

driverList = ['bob','fred','ethel']
tracks = ['daytona', 'charlotte', 'atlanta', 'darlington','lasvegas','watkins','talladega']
dynamicAllDriverFlagReportDict = {'bob': ['bob','i','','RevDn','','','',''],
                                  'fred': ['fred','In-Up','','','','RevUp','Ham',''],
                                  'ethel': ['ethel','','RevDn','','','In-Dn','Sht','']
                                  }    
global driverFrameDict    
driverFrameDict= dict() 

# Set up the GUI
window = tk.Tk()

myDataFrame = tk.Frame(master=window)
myDataFrame.pack()
btnFrame= tk.Frame(master=window, bg="gray")
btnFrame.pack(side="bottom")


for driverIndex in range(len(driverList)):
    myOneStockFrame = tk.Frame(master=myDataFrame, height=25, width=800)
    for tfIndex in range(len(tracks)+1):
        oneTFFrame = tk.Frame(master=myOneStockFrame,relief=tk.RAISED, borderwidth=1)#, height=25)#, width=8)
        if tfIndex == 0:
            label = tk.Label(master=oneTFFrame,text=driverList[driverIndex])#, height=15, width=8)
        else:
            print('driverIndex=', driverIndex, '; tfIndex=', tfIndex, 'dynamicAllDriverFlagReportDict=', dynamicAllDriverFlagReportDict[driverList[driverIndex]][tfIndex])
            label = tk.Label(master=oneTFFrame,textvariable=dynamicAllDriverFlagReportDict[driverList[driverIndex]][tfIndex])#,height=20)#, width=8)   
            print('label text = ', label.cget("textvariable"))                    
        label.pack()#padx=5,pady=5)
        #label.pack_propagate(0)
        oneTFFrame.grid(row=0,column=tfIndex)#, sticky= "nswe", padx=0, pady=0)
        #oneTFFrame.grid_propagate(0)

    myOneStockFrame.grid(row=driverIndex,column=0)#, sticky= "nswe", padx=0, pady=0)
    #myOneStockFrame.grid_propagate(0)

    driverFrameDict[driverList[driverIndex]] = myOneStockFrame  
    #print('driverFrameDict['+driverList[driverIndex]+'] = ', myOneStockFrame)

window.mainloop()

Вот результат: enter image description here

Спасибо.

1 Ответ

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

textvariable должен быть установлен как экземпляр одной из специальных переменных tkinter (StringVar, et c). Вы передаете строку, в результате чего создается новая внутренняя переменная с именем, совпадающим со строкой.

...