2015-06-02 21 views
6

Tôi đang viết một giao diện người dùng Kivy cho tiện ích dòng cmd mà tôi đã phát triển. Mọi thứ đều hoạt động tốt, nhưng một số quy trình có thể mất từ ​​vài giây đến vài phút để xử lý và tôi muốn cung cấp một số dấu hiệu cho người dùng biết rằng quy trình đang chạy. Lý tưởng nhất là ở dạng bánh xe quay hoặc thanh tải hay thứ gì đó, nhưng ngay cả khi tôi có thể cập nhật màn hình để cho người dùng biết rằng một tiến trình đang chạy, nó sẽ tốt hơn những gì tôi có bây giờ.Xây dựng thanh tiến trình đơn giản hoặc tải hình động trong Kivy

Hiện tại, người dùng nhấn một nút trong giao diện người dùng chính. Thao tác này sẽ trả về một cửa sổ bật lên xác minh một số thông tin quan trọng với người dùng và nếu họ hài lòng với các tùy chọn đó, họ nhấn nút 'chạy'. Tôi đã thử mở một popup mới để nói với họ rằng quá trình đang chạy, nhưng vì màn hình không cập nhật cho đến khi quá trình kết thúc, điều này không hoạt động.

Tôi bị mất kinh nghiệm viết mã, nhưng chủ yếu trong ngữ cảnh toán học và kỹ thuật, vì vậy tôi rất mới với thiết kế UI và phải xử lý các sự kiện và chủ đề. Một ví dụ tự chứa đơn giản sẽ được đánh giá cao.

+0

Xem [ví dụ này] (https://groups.google.com/forum/#!topic/kivy-users/QM0e_bmtlbU). Có thể bạn có thể sử dụng nó trong ứng dụng của riêng bạn. – doru

Trả lời

6

thời gian gần đây tôi đã giải quyết được vấn đề bạn mô tả: display doesn't update until the process finishes

Đây là một ví dụ hoàn chỉnh mà tôi đã làm việc với sự giúp đỡ của @andy_s trong kênh IRC#Kivy:

main.py của tôi:

from kivy.app import App 
from kivy.uix.popup import Popup 
from kivy.factory import Factory 
from kivy.properties import ObjectProperty 
from kivy.clock import Clock 

import time, threading 

class PopupBox(Popup): 
    pop_up_text = ObjectProperty() 
    def update_pop_up_text(self, p_message): 
     self.pop_up_text.text = p_message 

class ExampleApp(App): 
    def show_popup(self): 
     self.pop_up = Factory.PopupBox() 
     self.pop_up.update_pop_up_text('Running some task...') 
     self.pop_up.open() 

    def process_button_click(self): 
     # Open the pop up 
     self.show_popup() 

     # Call some method that may take a while to run. 
     # I'm using a thread to simulate this 
     mythread = threading.Thread(target=self.something_that_takes_5_seconds_to_run) 
     mythread.start() 

    def something_that_takes_5_seconds_to_run(self): 
     thistime = time.time() 
     while thistime + 5 > time.time(): # 5 seconds 
      time.sleep(1) 

     # Once the long running task is done, close the pop up. 
     self.pop_up.dismiss() 

if __name__ == "__main__": 
    ExampleApp().run() 

example.kv của tôi:

AnchorLayout: 
    anchor_x: 'center' 
    anchor_y: 'center' 
    Button: 
     height: 40 
     width: 100 
     size_hint: (None, None) 
     text: 'Click Me' 
     on_press: app.process_button_click() 

<PopupBox>: 
    pop_up_text: _pop_up_text 
    size_hint: .5, .5 
    auto_dismiss: True 
    title: 'Status' 

    BoxLayout: 
     orientation: "vertical" 
     Label: 
      id: _pop_up_text 
      text: '' 

Nếu bạn chạy ví dụ này, bạn có thể nhấp vào nút Click Me, nút này sẽ mở ra "thanh tiến trình" dưới dạng phương thức/cửa sổ bật lên. Cửa sổ bật lên này sẽ vẫn mở trong 5 giây mà không chặn cửa sổ chính. Sau 5 giây, cửa sổ bật lên sẽ tự động bị loại bỏ.

+0

Cảm ơn lời khuyên @Dirty Penguin. Tôi đang chơi xung quanh với điều này, bắt đầu với luồng và có một vấn đề rất lạ. Thay vì gọi chức năng của tôi khi tôi nhấn nút chạy trong ứng dụng của mình, tôi gọi một trình khởi chạy tạo ra cửa sổ bật lên 'đang chạy' và bắt đầu một chuỗi với chức năng của tôi. Vấn đề là khi chạy như là một chủ đề, chức năng làm những thứ kỳ lạ. Về cơ bản, chức năng của tôi tạo ra một bảng các nút dựa trên một csv, và khi chạy như một chủ đề, một số các nút này là màu trắng và không thể nhấp được. Nó là các nút khác nhau mỗi lần, và nó biến mất nếu tôi không chạy nó như là một chủ đề riêng biệt. Suy nghĩ? –

+0

Bật ra các nút lẻ này có thể nhấp được, chúng chỉ trông không thể giải thích khác với các nút còn lại trong lưới của tôi. nó thường là 1 hoặc 4 nút (trong số aprox 60) thực hiện điều này. Tất cả các nút khác có màu tô mặc định, nhưng các nút lạ này có màu trắng và không đánh dấu khi được nhấp. Cách duy nhất tôi có thể nói là họ có thể nhấp được bằng cách ràng buộc một bản in cho họ. –

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