2013-07-10 30 views
5

Tôi đã tạo một tập lệnh bằng Python để thông báo cho tôi tại một sự kiện cụ thể. Tôi đang sử dụng các chức năng sau đây để sản xuất cửa sổ cảnh báo:Tkinter TkMessageBox không đóng sau khi nhấp OK

def window_warn(): 
    ''' 
    This function will throw up a window with some text 
    ''' 
    #These two lines get rid of tk root window 
    root = Tkinter.Tk() 
    root.withdraw() 
    #tkMessageBox.deiconify() 
    TkMessageBox.showwarning("New Case", "You have a new case\n Please restart pycheck") 
    return 

Cửa sổ thu hút tốt, nhưng khi tôi bấm ok, cửa sổ vẫn ở vị trí với nút chán nản. Im sử dụng xfce. Có cách nào để có cửa sổ đóng sau khi ok được nhấp không?

Một bình luận chỉ ra điều này có thể làm với mã xung quanh, vì vậy cho đầy đủ:

print "Just started newcase check" 
while True: 
    if "Uncommitted" in webpage: 
     print "oh look, 'Uncommitted' is in the url returned from the last function" 
     #If this hits we call a notification window 
     window_warn() 
     print "sleeping" 
     time.sleep(10) 

     webpage = scrape_page() 
    else: 
     print "nothing" 
     time.sleep(20) 
     webpage = scrape_page() 
+0

Tôi vừa thêm mã đang gọi hàm cho ngữ cảnh – Rqomey

+0

Ngoài ra, khi tôi chạy điều này trong trình vỏ tương tác, nó hoạt động tốt. Không chắc chắn nếu nó là bởi vì tôi không nắm bắt sự trở lại 'ok' – Rqomey

Trả lời

6

thử gọi root.update() trước khi trở về từ hàm. Điều đó sẽ xử lý tất cả các sự kiện cửa sổ Tk/X đang chờ xử lý.

(lý tưởng, bạn muốn thiết lập một vòng lặp sự kiện chính trước khi hiển thị cửa sổ, nhưng điều đó giả định rằng toàn bộ chương trình của bạn là sự kiện điều khiển, mà có thể không luôn luôn làm việc.)

+0

Cảm ơn, Điều này có vẻ chính xác! – Rqomey

+0

Xin lỗi, bạn có thể giải thích ý nghĩa của vòng lặp sự kiện chính không? Chương trình quét một trang web mỗi phút. – Rqomey

+0

Các chương trình Tkinter thường (nhưng không phải lúc nào) bao gồm Tk "ở trên cùng" và mã của bạn đang chạy bằng cách gọi lại - tức là bạn đã thiết lập phần Tk trước, gọi mainloop, rồi đợi Tk gọi cho bạn, thường trả lời cho người dùng tương tác với chương trình. Đó có thể là một chút không thực tế đối với trường hợp của bạn, mặc dù. – Fredrik

0

Bạn phải gọi root.mainloop() để kích hoạt chương trình để đáp ứng với các sự kiện.

+0

Vì vậy, tôi gọi là' root.mainloop() 'ngay sau khi' tkmb.showwarning ("Trường hợp mới", "Bạn có một trường hợp mới") 'và có vẻ như chỉ để treo, không làm gì cả. Liệu nó có cần được gọi theo một cách nào đó không? Cảm ơn – Rqomey

+0

Nó phải đang chạy _before_ bạn mở hộp thoại, vì mở các khối hộp thoại cho đến khi hộp thoại bị loại bỏ. –

0

Một vấn đề trên mã của bạn là bạn tạo phần tử Tk mới mỗi khi bạn gọi hàm window_warn. Điều này có thể không phải là nguyên nhân của vấn đề của bạn, nhưng việc tạo nhiều phần tử Tk là một thực hành không tốt nên tránh. Ví dụ, khởi tạo phần tử gốc ngay từ đầu và chỉ để lại lời kêu gọi showwarning:

root = Tkinter.Tk() 
root.withdraw() 

def window_warn(): 
    '''This function will throw up a window with some text''' 
    tkMessageBox.showwarning("New Case", "You have a new case\n Please restart pycheck") 
    return 

print "Just started newcase check" 
while True: 
    # ... 
+0

Tôi thấy điểm của bạn ở đây. Nếu tôi gọi gốc bên ngoài hàm tôi không thể cạy root.update() trên nó trong hàm. Có lẽ tôi đã thiết lập nó theo cách không chính xác, và tôi nên có một phần chạy đầu tiên để khởi động root = Tkinter.Tk(), Im đang chạy trong một hộp thiết bị đầu cuối cho bây giờ anyway vì vậy nó có vẻ làm việc tốt tại thời điểm này (không có sự trùng lặp của các cửa sổ) – Rqomey

+0

Mã trong hàm vẫn có thể truy cập root nếu nó được định nghĩa bên trong cùng một mô-đun (được gọi là biến "toàn cầu" trong Python, mặc dù nó chỉ hiển thị trực tiếp với mã bên trong cùng một mô-đun). Tôi không thấy bất kỳ tác hại lớn trong việc tái tạo cửa sổ gốc Tk, mặc dù. – Fredrik

0

tôi đã làm nó tis cách:

import Tkinter as tk 
import tkMessageBox 
root = tk.Tk() 
root.withdraw() 
t = tkMessageBox.askyesno ('Title','Are you sure?') 
if t: 
    print("Great!!!") 
    root.update() 
else: 
    print("Why?") 
    root.update() 
Các vấn đề liên quan