2013-04-25 28 views
6

ive đã thử tìm kiếm giải pháp nhưng không thể tìm thấy giải pháp hoạt động. Tôi có một danh sách 2d của nút tkinter, và tôi muốn thay đổi văn bản của họ khi nó được nhấp chuột. Tôi đã cố gắng làm điều này:lệnh nút tkinter với lambda bằng Python

def create_board(number): 
    print(number) 
    for i in range (0,number): 
     buttonList.append([]) 
     for j in range(0,number): 
      print(i,j) 
      buttonList[i].append(Button(root, text = " ", command = lambda: update_binary_text(i,j))) 
      buttonList[i][j].pack() 

Sau đó, khi nó được nhấp vào nó cuộc gọi chức năng này:

def update_binary_text(first,second): 
    print(first,second) 
    buttonList[first][second]["text"] = "1" 

Khi tôi bấm vào một nút, nó chỉ đơn giản là không có gì, tôi đã có chương trình hiển thị các chỉ số của nút đã được nhấp và tất cả chúng hiển thị 4, 4 (đây là khi số biến = 5) Có giải pháp cho điều này không?
đây là lần thử python đầu tiên của tôi cho một lớp học.

Cảm ơn

Trả lời

8

Bạn có thể khắc phục vấn đề này bằng cách tạo ra một kết thúc cho ij với việc tạo ra của mỗi lambda:

command = lambda i=i, j=j: update_binary_text(i, j) 

Bạn cũng có thể tạo ra một nhà máy gọi lại với tham chiếu đến các nút đối tượng tự :

def callback_factory(button): 
    return lambda: button["text"] = "1" 

Và sau đó trong mã khởi tạo của bạn:

for j in range(0, number): 
    new_button = Button(root, text=" ") 
    new_button.configure(command=callback_factory(new_button)) 
    new_button.pack() 
    buttonList.append(new_button) 
+0

WOW! giải pháp của bạn đã hoạt động! cảm ơn ngài! Bây giờ tôi bị mắc kẹt với ví dụ đầu tiên bạn đăng. Nhưng tôi chắc chắn sẽ nghiên cứu ví dụ thứ hai bạn đã cho thấy. Cảm ơn một lần nữa! – vap

0

Bất cứ khi nào tôi cần một bộ sưu tập các tiện ích tương tự, tôi thấy nó đơn giản nhất để đưa chúng vào một đối tượng và chuyển một phương thức ràng buộc làm gọi lại thay vì chơi thủ thuật với lambda. Vì vậy, thay vì có một danh sách như buttonList[] với các widget, tạo ra một đối tượng:

class MyButton(object): 
    def __init__(self, i, j): 
     self.i = i 
     self.j = j 
     self.button = Button(..., command = self.callback) 

    def callback(self): 
     . . . 

Bây giờ, bạn có một danh sách buttonList[] của các đối tượng, chứ không phải là widget mình. Để cập nhật văn bản, hoặc cung cấp một phương thức cho điều đó, hoặc truy cập trực tiếp vào thành viên: buttonList[i].button.configure(. . .) Và khi gọi lại được kích hoạt, nó có toàn bộ đối tượng và bất kỳ thuộc tính nào bạn có thể cần trong self.