หน้าจอการโหลดอย่างง่ายใน python Tkinter

ฉันเป็นผู้เรียน Python ระดับเริ่มต้น โดยเฉพาะ tkinter

ฉันต้องการสร้าง 'หน้าจอการโหลด' ของสคริปต์ python แบบง่ายและปิดหลังจากสคริปต์สิ้นสุด

แต่การสร้างหน้าต่างต้องใช้ฟังก์ชัน mainloop ซึ่งหมายความว่ามันจะวนซ้ำไม่สิ้นสุดหรือรอการโต้ตอบของผู้ใช้ (หรืออย่างที่ฉันคิด) และมันจะกำจัดแนวคิดเรื่องหน้าจอ 'กำลังโหลด'

ฉันลองอะไรบางอย่างแล้ว แต่จบลงด้วย (ใส่หน้าจอกำลังโหลด) -> (หน้าจอกำลังโหลดยังคงมี mainloop) -> (ไม่สามารถเรียกใช้สคริปต์ได้เนื่องจากการรอ)

สิ่งที่ฉันต้องการโดยละเอียดคือ (ใส่สคริปต์โหลด) -> (เรียกใช้สคริปต์) -> (สิ้นสุดสคริปต์) -> (ทำลายหน้าจอโหลด)

ฉันมีประสบการณ์มากมายในภาษาอื่นโดยเฉพาะ Java แต่ java สามารถประกาศเฟรม -> เรียกใช้สิ่งอื่น ๆ ในภายหลัง -> เรียก frame.dispose() ก็แค่นั้นแหละ คำแนะนำหรือข้อเสนอแนะสำหรับผู้เรียน?

แก้ไข: จริง ๆ แล้วสคริปต์เป็นอัลกอริธึมการประมวลผลภาพที่เชื่อมต่อกับฐานข้อมูลและฉันไม่สามารถรอหรือพักเครื่องตามกำหนดเวลาได้เนื่องจากฐานข้อมูลสามารถขยายได้และอาจใช้เวลานานกว่าเวลาที่จัดสรร


person Darrius    schedule 12.06.2018    source แหล่งที่มา
comment
คุณต้องใช้ threading หรือ กระบวนการย่อย   -  person Konstantin    schedule 12.06.2018


คำตอบ (1)


บางอย่างในบรรทัดเหล่านี้อาจใช้ได้ผลสำหรับคุณ สิ่งนี้จะสร้างหน้าต่าง root และกำหนดฟังก์ชัน task ซึ่งจะทำลาย root เป็นสิ่งสุดท้ายที่มันทำ ในตัวอย่างนี้ task จะพักการทำงานเป็นเวลาสองวินาที แต่คุณจะต้องแทนที่การเรียก sleep ด้วยโค้ดใดๆ ก็ตามที่คุณต้องการเรียกใช้

คุณใส่ฟังก์ชัน task ลงในคิวเหตุการณ์ลูปหลักด้วย root.after(200, task) ซึ่งหมายความว่าโค้ดจะสร้างหน้าต่าง root ก่อน รอ 200 มิลลิวินาที จากนั้นจึงเรียก task() ซึ่งจะพักเป็นเวลาสองวินาทีและทำลายหน้าต่างนั้น อย่างน้อยสำหรับตัวอย่างนี้ คุณต้องมีความล่าช้า 200 มิลลิวินาที เพื่อให้ลูปหลักมีเวลาเพียงพอในการวาดหน้าต่างก่อนที่การเรียก sleep จะหยุดทุกอย่าง (ตัวเลขอาจแตกต่างกันสำหรับคุณ เพิ่มมันหากหน้าต่างวาดไม่ถูกต้อง)

import tkinter as tk
from time import sleep

def task():
    # The window will stay open until this function call ends.
    sleep(2) # Replace this with the code you want to run
    root.destroy()

root = tk.Tk()
root.title("Example")

label = tk.Label(root, text="Waiting for task to finish.")
label.pack()

root.after(200, task)
root.mainloop()

print("Main loop is now over and we can do other stuff.")

แก้ไข: เพิ่มความคิดเห็นในรหัส

person Dronir    schedule 12.06.2018
comment
ขอบคุณสำหรับการตอบกลับ แต่ฉันต้องการทำให้มันมีชีวิตชีวามากที่สุดเท่าที่จะเป็นไปได้และหลีกเลี่ยงสถานการณ์ที่กำหนดเวลาไว้ - person Darrius; 12.06.2018
comment
ฉันไม่แน่ใจว่าคุณหมายถึงอะไร แต่ไม่ได้ขึ้นอยู่กับช่วงเวลาที่ใช้ในตัวอย่างของฉัน การเรียก sleep เป็นเพียงการแทนที่จำลองสำหรับการคำนวณที่คุณต้องการให้หน้าต่างเปิดอยู่ ความล่าช้า 200 ms ในการเข้าคิวเพียงเพื่อให้เวลาสักพักในการแสดงผลหน้าต่าง เนื่องจาก sleep จะค้าง - person Dronir; 12.06.2018
comment
มันได้ผล ฉันต้องเรียนรู้วิธีใช้และไม่เข้าใจในตอนแรก ขอบคุณ - person Darrius; 12.06.2018