Субвиджет TixComboBox не выбирает / устанавливается на указанное значение при первом использовании

У меня есть TixExFileSelectDialog что связано с несколькими Entry объекты в моей программе; диалоговое окно настраивается динамически, чтобы выбранный файл соответствовал тексту в Entry диалог используется для. Тем не менее, первый раз, когда открывается диалоговое окно, независимо от того, какой Entry используется, он отображает только строку шаблона, даже когда Entry уже имеет значение по умолчанию. Однако, если я отменяю диалог и затем снова открываю его, он отображает правильную строку. Это происходит, когда я устанавливаю любую комбинацию со списком selection а также value параметры (один, другой и оба), а также когда я устанавливаю поле со списком variable вариант к StringVar, Есть ли что-то, что я пропускаю в том, как TixComboBoxс функцией?

Код, который я сейчас использую (с некоторым переформатированием /etc. Для публикации):

from tkinter.tix import *

opts = {'path': 'C:\\'}

class ImportGUI(Frame):
    def _setfsd(self, directory='', pattern='*.xls', variable='', selection=None):
        "Reconfigures the ExFileSelectDialog to enable reusability."
        self.fsd.fsbox.config(directory=directory or opts['path'], # can't use opts['path'] as a default argument, because it could change.
                              pattern=pattern)

        self.fsd.fsbox.file['variable'] = variable

        if not variable:
            self.fsd.fsbox.file['value'] = selection or pattern # Defaults to the pattern, which is the behavior of a fresh ExFileSelectionBox.
        elif selection is not None:   # variable exists, but setting selection manually as well
            self.fsd.fsbox.file['value'] = selection

    def _selectdatafile(self):
        self._setfsd(selection='apple1.xls')
        self.fsd.popup()

    def _selectcodefile(self):
        self._setfsd(selection='apple2.xls')
        self.fsd.popup()

    def createWidgets(self):
        self.fsd = ExFileSelectDialog(self.master) # a top-level widget, so giving it the default root as master

        self.dfrow = Frame(self)
        self.cfrow = Frame(self)

        self.dfentry = Entry(self.dfrow)
        self.dfentry.pack(side='left')
        self.cfentry = Entry(self.cfrow)
        self.cfentry.pack(side='left')

        self.dfbtn = Button(self.dfrow, text='...', command=self._selectdatafile)
        self.dfbtn.pack(side='left')
        self.cfbtn = Button(self.cfrow, text='...', command=self._selectcodefile)
        self.cfbtn.pack(side='left')

        self.dfrow.pack()
        self.cfrow.pack()
        self.pack()

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master.tk.eval('package require Tix')
        self.createWidgets()

if __name__ == '__main__': # for testing
    gui = ImportGUI()
    gui.mainloop()

1 ответ

Решение

Оказывается, мне не нужно было ничего делать, потому что я могу просто использовать askopenfilename() от tkinter.filedialogчтобы получить именно ту функциональность, которую я желаю, используя внешний вид текущей ОС. Так много для Тикса.

(Ну, это было несовсем то , что я хотел, так как внешний вид был немного устаревшим в Windows, но он был достаточно близок. [IDLE, кажется, тоже использует его, в этом отношении.])

Другие вопросы по тегам