我在Windows 1010中使用Python 2.7.8。这确实让我发疯:我只想在网格化后立即为ttk.Combobox()设置一个默认的预选值。这是我的代码:

from Tkinter import *
import ttk

class open_review_frame():
    def __init__(self, original):
        self.root = original
        self.review_frame = LabelFrame(original, text="review", bd=1, height=400, width=500)
        self.review_frame.grid(row=0, column=1, sticky=W + N, ipadx=10, ipady=10)
        self.rowline = 0

        self.review_type_val = StringVar()
        self.review_type = ttk.Combobox(self.review_frame, width=12, textvariable=self.review_type_val, state='readonly')
        self.review_type['values'] = ("a", "b", "c", "d")
        self.review_type.current(0)
        self.review_type.grid(row=self.rowline, column=2, sticky=W)

class main_frame():
    def __init__(self, original):
        self.root = original

        review_frame_test = open_review_frame(self.root)

if __name__ == "__main__":
    root = Tk()
    app = main_frame(original=root)
    root.mainloop()


这将绘制一个空的组合框。令人费解的是,如果我将替换文本配置替换为textvariable config,它会完美运行:

from Tkinter import *
import ttk

class open_review_frame():
    def __init__(self, original):
        """Constructor"""
        self.root = original

        self.review_frame = LabelFrame(original, text="review", bd=1, height=400, width=500)
        self.review_frame.grid(row=0, column=1, sticky=W + N, ipadx=10, ipady=10)
        self.rowline = 0

        self.review_type_val = StringVar()
        self.review_type = ttk.Combobox(self.review_frame, width=12, text= "", state='readonly')
        #self.review_type = ttk.Combobox(self.review_frame, width=12, textvariable=self.review_type_val, state='readonly')
        self.review_type['values'] = ("a", "b", "c", "d")
        self.review_type.current(0)
        self.review_type.grid(row=self.rowline, column=2, sticky=W)

class main_frame():
    def __init__(self, original):
        self.root = original

        review_frame_test = open_review_frame(self.root)

if __name__ == "__main__":
    root = Tk()
    app = main_frame(original=root)
    root.mainloop()


我不明白为什么?

最佳答案

我猜不出您要达到的最终目的是什么。不过,如果您的目的只是初始化组合框,那么让我们开始吧:


  令人费解的是,如果我将替换文本配置与
  textvariable配置,可以完美运行


实际上,发生的情况与您所说的相反:组合框无法使用textvariable选项初始化。

出现这种意外行为的原因是因为您没有正确使用StringVar()。您需要首先设置self.review_type_val的值。在您的情况下,您要将其设置为“ a”,请执行以下操作:

self.review_type['values'] = ("a", "b", "c", "d")
self.review_type_val.set(self.review_type['values'][0])


然后使用get()在组合框中获取该值:

self.review_type = ttk.Combobox(self.review_frame, width=12, textvariable=self.review_type_val.get(), state='readonly')

10-04 21:47