Я - очередной новичок, изучающий Питон, поэтому вопросы могут быть несколько.. простыми для вас. Это на всякий случай, чтобы не удивлялись.
К сути. Я пишу интерфейс на Tk под Python 3.5.1. В моём коде есть инструкция, которая должна встраивать в виджет Text кучку виджетов Checkbutton. Делается это с помощью команды вида “self.window_create('end', window=cb)”. Так вот при попытке её выполнения вылетает эксепшен:
_tkinter.TclError: can't embed .19551680 in .19474248.19511280.19512568
can't read "::tcl_pkgPath": no such variable while executing "foreach Dir $::tcl_pkgPath { if {$Dir ni $::auto_path} { lappend ::auto_path $Dir } }"
Итак, собственно вопрос: как же правильно скормить встроенному Tcl эту самую tcl_pkgPath? Tcl я не знаю совсем, а то, что нарыл по теме в сети, мне ничего не дало. Точнее, я узнал, что tcl_pkgPath нельзя задавать из самой программы, нужно для задания пути к библиотекам пользоваться auto_path, вот только из сообщения об ошибке явственно следует, если я правильно понимаю, что тут этот способ не поможет - переменная почему-то не инициализирована изначально.
Прошу помощи у знатоков Python/Tcl!
Всем большое спасибо.
PS: На всякий случай прикладываю упрощённый вариант кода. Отдельно этот код прекрасно работает. А вот если встроить его (даже именно в таком виде, не меняя ни буквы) в моё приложение, работать перестаёт. Если надо, могу дать ссылку на гитхаб, где оно лежит (хотя позориться пока не хотелось бы - код далёк от профессионального
from tkinter import * class Tagslist(Frame): def __init__(self, parent=None, **options): Frame.__init__(self, master=parent) self.textbox = Text(self, **options) scroller = Scrollbar(self) scroller.config(command=self.textbox.yview) self.textbox.config(yscrollcommand=scroller.set) self.states_dict = {1: [1, 'tag1'], 2: [0, 'tag2'], 3: [1, 'tag3']} for key in self.states_dict: state = self.states_dict[key][0] self.states_dict[key][0] = IntVar() cb = Checkbutton(text=self.states_dict[key][1], variable=self.states_dict[key][0]) try: self.textbox.window_create('end', window=cb) # Вот тут оно и падает. except TclError as err: print(err) tcl = Tcl() errorInfo = tcl.eval("set ::errorInfo") # Кстати, это работает на Windows, но на Linux вызывает ещё одно исключение. print(errorInfo) self.textbox.insert('end', '\n') self.states_dict[key][0].set(state) scroller.grid(row=0, column=1, sticky='sn') self.textbox.grid(row=0, column=0, sticky='news') self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure('all', weight=1) root = Tk() f = Tagslist(root) f.grid() root.mainloop()