2011-07-29 37 views
8

Tôi đang sử dụng Python 3.2.1 trong Arch Linux x86_64. Điều này thực sự khiến tôi phát điên: Tôi chỉ muốn có giá trị mặc định, được chọn trước cho số ttk.Combobox ngay khi tôi lưới điện. Đây là mã của tôi:Đặt giá trị mặc định cho Hộp tổ hợp ttk

from tkinter import Tk, StringVar, ttk 

root = Tk() 

def combo(parent): 
    value = StringVar() 
    box = ttk.Combobox(parent, textvariable=value, state='readonly') 
    box['values'] = ('A', 'B', 'C') 
    box.current(0) 
    box.grid(column=0, row=0) 

combo(root) 

root.mainloop() 

Rút ra một sản phẩm nào Combobox. Điều thú vị là nếu tôi không sử dụng chức năng, nó hoạt động hoàn hảo:

from tkinter import Tk, StringVar, ttk 

root = Tk() 

value = StringVar() 
box = ttk.Combobox(root, textvariable=value, state='readonly') 
box['values'] = ('A', 'B', 'C') 
box.current(0) 
box.grid(column=0, row=0) 

root.mainloop() 

Tất nhiên, trong chương trình thực, tôi phải sử dụng một hàm, vì vậy tôi cần một giải pháp khác.

Trả lời

23

Vấn đề là trường hợp của StringVar đang bị thu gom rác. Điều này là do nó là một biến địa phương do cách bạn viết mã của bạn.

Một giải pháp là sử dụng một lớp để StringVar của bạn vẫn tồn tại:

from tkinter import Tk, StringVar, ttk 

class Application: 

    def __init__(self, parent): 
     self.parent = parent 
     self.combo() 

    def combo(self): 
     self.box_value = StringVar() 
     self.box = ttk.Combobox(self.parent, textvariable=self.box_value, 
           state='readonly') 
     self.box['values'] = ('A', 'B', 'C') 
     self.box.current(0) 
     self.box.grid(column=0, row=0) 

if __name__ == '__main__': 
    root = Tk() 
    app = Application(root) 
    root.mainloop() 
+0

Cảm ơn bạn, nó hoạt động hoàn hảo! Trên thực tế tôi đã sử dụng một lớp trong ứng dụng của mình, nhưng tôi đã sử dụng biến cục bộ cho 'box_value'; với 'self.box_value' nó làm thủ thuật;) – kynikos

+0

Xin lỗi để nhảy vào, nhưng khi tôi nhập ttk, nó không nhận ra" Combobox "như một tùy chọn hoặc widget. Ý tưởng nào? – texasman1979

+0

@ texasman1979, bạn đang sử dụng phiên bản Python nào và hệ điều hành nào? Kiểm tra 'ttk .__ file__' để đảm bảo đó là mô-đun' ttk' đúng. – eryksun

4

Khi chức năng của bạn thoát 'kết hợp', biến địa phương 'giá trị' bị phá hủy. Bạn cần biến cố định, chẳng hạn như biến toàn cục hoặc biến là thuộc tính của lớp để giá trị không được thu thập rác trong khi tiện ích vẫn tồn tại.

+0

Cảm ơn lời giải thích kỹ thuật ^^ – kynikos

0

Phương thức get() có thể được sử dụng trong chức năng của bạn để đổi tên StringVar và lưu nó dưới tên khác để tránh bị mất hoàn toàn thông qua bộ sưu tập rác.

value = StringVar()

keepvalue = value.get()

sau đó sử dụng 'keepvalue' thay vì giá trị:

hộp = ttk.Combobox (root, textvariable = keepvalue, tiểu bang = 'readonly')

Điều này có 'A' hiển thị trong hộp kết hợp cho tôi.

Các vấn đề liên quan