2011-12-16 49 views
6

Tôi có danh sách độ dài thay đổi và muốn tạo hộp kiểm (với python TKinter) cho mỗi mục nhập trong danh sách (mỗi mục tương ứng với máy nên bật hoặc tắt bằng hộp kiểm -> thay đổi giá trị trong từ điển).Làm cách nào để tạo nhiều hộp kiểm từ danh sách trong vòng lặp for trong python tkinter

print enable 
{'ID1050': 0, 'ID1106': 0, 'ID1104': 0, 'ID1102': 0} 

(ví dụ, có thể là bất kỳ chiều dài)

nay là mã có liên quan:

for machine in enable: 
    l = Checkbutton(self.root, text=machine, variable=enable[machine]) 
    l.pack() 
self.root.mainloop() 

Mã này tạo ra 4 hộp kiểm nhưng tất cả chúng đều hoặc đánh dấu hoặc unticked với nhau và các giá trị trong enable dict không thay đổi. Giải quyết thế nào? (Tôi nghĩ rằng l không hoạt động, nhưng làm cách nào để tạo biến này?)

Trả lời

12

Biến "được truyền cho mỗi nút kiểm tra phải là một phiên bản của Biến Tkinter - vì nó là giá trị" 0 "đó là thông qua, và điều này gây ra missbehavior.

Bạn có thể tạo các trường hợp Tkinter.Variable về ông cùng cho vòng lặp bạn tạo checkbuttons - chỉ cần thay đổi mã của bạn để:

for machine in enable: 
    enable[machine] = Variable() 
    l = Checkbutton(self.root, text=machine, variable=enable[machine]) 
    l.pack() 

self.root.mainloop() 

Sau đó bạn có thể kiểm tra trạng thái của mỗi hộp bằng phương pháp get của nó như trong enable["ID1050"].get()

+0

Cảm ơn bạn! Các hộp kiểm hoạt động ngay bây giờ, chỉ một câu hỏi: làm thế nào tôi có thể đọc các biến bên ngoài lớp tkinter (tôi đã thiết lập nó như sau: http://stackoverflow.com/a/1835036/1102225). Tôi đã thử mọi thứ. Khi tôi sử dụng 'print enable [machine] .get() AttributeError: đối tượng 'int' không có thuộc tính 'get'' Vì vậy, tôi đã thử: ' print app.enable [machine] .get() AttributeError:' MyTkApp 'đối tượng không có thuộc tính' enable'' (ứng dụng là đối tượng của lớp tkinter được gọi là MyTkApp) Và khi tôi làm điều đó mà không có được: 'print enable [machine] PY_VAR0' – Sebastian

+0

Oh tôi đã tự mình! Tôi bao gồm một hàm trong lớp tkinter để trả về giá trị: 'def read (self, machine): \t return enable [machine] .get() ' sau đó bên ngoài lớp bạn có thể gọi ví dụ: ' print app.read (1050) ' – Sebastian

1

Chỉ cần nghĩ rằng tôi muốn chia sẻ ví dụ của tôi cho một danh sách thay vì một từ điển:

from Tkinter import * 

root = Tk()  

users = [['Anne', 'password1', ['friend1', 'friend2', 'friend3']], ['Bea', 'password2', ['friend1', 'friend2', 'friend3']], ['Chris', 'password1', ['friend1', 'friend2', 'friend3']]] 

for x in range(len(users)): 
    l = Checkbutton(root, text=users[x][0], variable=users[x]) 
    print "l = Checkbutton(root, text=" + str(users[x][0]) + ", variable=" + str(users[x]) 
    l.pack(anchor = 'w') 

root.mainloop() 

Hy vọng điều này sẽ giúp

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