2010-10-19 31 views
6

Tôi đang sử dụng thanh trượt để cập nhật hình ảnh của mình, nhưng lệnh updateValue được gửi mỗi khi tôi di chuyển ngón tay cái trượt, ngay cả đối với các giá trị trung gian.TkInter, thanh trượt: cách kích hoạt sự kiện chỉ khi quá trình lặp hoàn tất?

Thay vào đó, tôi chỉ muốn kích hoạt nó khi tôi nhả chuột và tương tác hoàn tất.

self.slider = tk.Scale(self.leftFrame, from_=0, to=256, orient=tk.HORIZONTAL, command=updateValue) 

Làm cách nào để kích hoạt chức năng một lần, khi kết thúc tương tác?

Trả lời

4

Bạn không thể.

Thay vào đó, bạn có thể thực hiện lệnh chậm trễ bất kỳ công việc thực tế nào trong một khoảng thời gian ngắn bằng cách sử dụng 'sau'. Mỗi khi lệnh của bạn được gọi, hãy hủy mọi công việc đang chờ xử lý và lên lịch lại công việc. Tùy thuộc vào yêu cầu thực tế của bạn là gì, trễ nửa giây có thể là đủ.

Một lựa chọn khác là không sử dụng tính năng lệnh dựng sẵn và thay vào đó sử dụng các ràng buộc tùy chỉnh. Điều này có thể là rất nhiều công việc để có được chính xác, nhưng nếu bạn thực sự cần kiểm soát hạt mịn bạn có thể làm điều đó. Đừng quên rằng người ta có thể tương tác với các widget bằng cách sử dụng bàn phím ngoài chuột.

Dưới đây là một ví dụ ngắn cho thấy làm thế nào để sắp xếp công việc phải thực hiện trong một nửa thứ hai:

import Tkinter as tk 

#create window & frames 
class App: 
    def __init__(self): 
     self.root = tk.Tk() 
     self._job = None 
     self.slider = tk.Scale(self.root, from_=0, to=256, 
           orient="horizontal", 
           command=self.updateValue) 
     self.slider.pack() 
     self.root.mainloop() 

    def updateValue(self, event): 
     if self._job: 
      self.root.after_cancel(self._job) 
     self._job = self.root.after(500, self._do_something) 

    def _do_something(self): 
     self._job = None 
     print "new value:", self.slider.get() 

app=App() 
+0

Ok, cách tốt nhất để trì hoãn 0.5 là gì? – aneuryzm

+0

@Patric: Tôi đã chỉnh sửa câu trả lời để bao gồm một ví dụ –

+0

Cảm ơn, tôi nhận được lỗi này: AttributeError: đối tượng 'str' không có thuộc tính '_job' – aneuryzm

16

này là khá một câu hỏi cổ xưa bây giờ, nhưng trong trường hợp bất cứ ai tình cờ gặp vấn đề cụ thể này chỉ cần sử dụng các ràng buộc() và chức năng "ButtonRelease-1" sự kiện như vậy:

import Tkinter as tk 

class App: 
    def __init__(self): 
     self.root = tk.Tk() 

     self.slider = tk.Scale(self.root, from_=0, to=256, 
           orient="horizontal") 
     self.slider.bind("<ButtonRelease-1>", self.updateValue) 
     self.slider.pack() 
     self.root.mainloop() 

    def updateValue(self, event): 
     print self.slider.get() 

app=App() 

Hy vọng điều này sẽ giúp bất cứ ai!

+0

Tôi biết đây là câu trả lời cho câu hỏi có liên quan, nhưng đó chính là câu trả lời tôi đang tìm kiếm. Cảm ơn bạn. – mhourdakis

+2

Hãy coi chừng! Nếu Scale.takefocus là True, thì mọi người sẽ có thể di chuyển thanh trượt chỉ bằng các phím mũi tên trên bàn phím. ** Nhưng không có gì sẽ xảy ra ** bởi vì bạn chỉ bắt chuột. Để khắc phục, hãy nắm bắt các phím bấm quá. (Bạn có thể liên kết nhiều sự kiện cho một lần gọi lại duy nhất) – AneesAhmed777

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