एनीमेशन काम में फीका क्यों नहीं है, लेकिन एनीमेशन से बाहर फीका काम करता है?
मैं अजगर के लिए नया हूं और मैं इस विचार के साथ आया हूं कि टिक्टर और समय मॉड्यूल का उपयोग करके अजगर में एक साधारण फीका एनीमेशन कैसे बनाया जाए । मैंने कार्यक्रम के लिए दो एनिमेशन परिभाषित किए हैं: एक फीका करने के लिए और दूसरा एक फीका करने के लिए। फीका आउट एनीमेशन पूरी तरह से काम करता है और वास्तव में मैं इसे कैसे चाहता हूं, हालांकि, एनीमेशन में फीका काम नहीं करता है। जब तक लूप समाप्त नहीं हो जाता तब तक कार्यक्रम बहुत अधिक नहीं दिखा। क्या मैं कुछ गलत कर रहा हूं या क्या अजगर अजगर में प्रभाव को फीका बनाना असंभव है? यहाँ मेरा कोड स्निपेट है:
from tkinter import *
import time
root = Tk()
transparency = 0
while transparency <= 1:
transparency += 0.1
root.wm_attributes("-alpha", transparency)
time.sleep(0.03)
def fade():
t = 1
while t > 0:
t -= 0.1
root.wm_attributes("-alpha", t)
time.sleep(0.03)
root.destroy()
btn = Button(root, text='fade exit', command=fade).pack()
root.mainloop()
जवाब
while
लूप का उपयोग करने के बजाय और time
, उपयोग after(millis, function)
और पुनरावृत्ति।
बोनस:
- फीका प्रभाव और व्यवहार को अनुकूलित करने के लिए फ़ंक्शन तर्कों का उपयोग करें
- यह अपडेट करने से रूट को ब्लॉक नहीं करेगा
- सब कुछ अस्त-व्यस्त है
- इन कार्यों को किसी भी
Toplevel
विंडो पर उपयोग किया जा सकता है applyFades
एक कॉल में सब कुछ प्रबंधित करता है
यदि आपको इन सुविधाओं को ए में संलग्न करने की आवश्यकता है Button
, तो बस command
इस तरह के तर्क को असाइन करें command=lambda: fadeOut(root)
:।
window.py
''' Fade In
@window ~ the window to affect
@millis ~ the amount of milliseconds to wait before next recursion
@inc ~ the amount to increment alpha on each recursion
'''
def fadeIn(window, millis:int=50, inc:float=0.1):
alpha = float(window.attributes('-alpha')) + inc
window.attributes('-alpha', alpha)
if alpha < 1:
window.after(millis, lambda: fadeIn(window, millis, inc))
else:
window.attributes('-alpha', 1.0)
''' Fade Out
@window, @millis ~ see: Fade In
@dec ~ the amount to decrement alpha on each recursion
@destroy ~ True|False destroy the window when effect is complete
'''
def fadeOut(window, millis:int=50, dec:float=0.1, destroy:bool=True):
alpha = float(window.attributes('-alpha')) - dec
window.attributes('-alpha', alpha)
if alpha > 0:
window.after(millis, lambda: fadeOut(window, millis, dec, destroy))
else:
window.attributes('-alpha', 0.0)
if destroy:
window.destroy()
''' Assign All Fades In One Call
@window, @millis, @inc ~ see: Fade In
@dec, @destroy ~ see: Fade Out
@close ~ True|False add fadeOut effect to window close button
'''
def applyFades(window, millis:int=50, inc:float=0.1, dec:float=0.1, destroy:bool=True, close:bool=True):
window.attributes('-alpha', 0.0)
window.after(millis, lambda: fadeIn(window, millis, inc))
if close:
window.protocol("WM_DELETE_WINDOW", lambda: fadeOut(window, millis, dec, destroy))
मेनहोम
import tkinter as tk
import window as win
root = tk.Tk()
win.applyFades(root)
root.mainloop()
आइए देखें कि आप स्क्रिप्ट क्या करते हैं। शुरुआत root = Tk()में असाइन किया गया है जो एक tcl / tk दुभाषिया शुरू करता है और एक रूट विंडो बनाता है। तब यह अपनी अस्पष्टता विशेषता को फीका करने के लिए नियंत्रित करता है। उसके बाद एक बटन विजेट को रूट विंडो पर रखा जाता है जिसमें ये गुण होते हैं:
- एक पाठ 'फीका निकास' विजेट पर शीर्ष पर लिखा गया है
- यह एक माउस क्लिक का इंतजार करता है और इसे खत्म करने के बाद रूट विंडो की अपारदर्शिता विशेषता को नियंत्रित करता है।
अंत में, root.mainloop()एक विकल्प है
while True:
root.update_idletasks()
root.update()
आप ध्यान दे सकते हैं कि जिस समय आपकी रूट विंडो अपडेट नहीं होती है उस समय 'फीका' बटन बनाया जा रहा है। यह एक कारण है कि आप वास्तविक फीका को देखने में सक्षम नहीं हैं।
समाधान 1. लुप्त होती के प्रत्येक नमूने के बाद रूट विंडो को अपडेट करना:
from tkinter import *
import time
def fade():
t = 1
while t > 0:
t -= 0.1
root.wm_attributes("-alpha", t)
time.sleep(0.03)
root.destroy()
root = Tk()
transparency = 0
btn = Button(root, text='fade in', command=fade)
btn.pack()
while transparency <= 1:
transparency += 0.1
root.wm_attributes("-alpha", transparency)
root.update_idletasks()
root.update()
time.sleep(0.03)
btn.configure(text='fade exit') #I guess no new button is needed and text should be replaced only
root.mainloop()
समाधान 2. यह अधिक विशिष्ट है कि विधि के tkinter
साथ संयोजन time
और उपयोग न करें after
। माइकल का जवाब देखें।