दिलचस्प पोस्ट
व्युत्पन्न कक्षा में सी ++ कास्ट अक्षम पंक्तियों के साथ एनजी-विकल्प सूची की सूची (एक अनियमित) समतल करें डायरेक्टरी लिस्टिंग पायथन में क्या एक सूत्र का मूल्यांकन करने का कोई तरीका है जो सेल में जमा हो जाता है? ADO.NET में आउटपुट पैरामीटर मान प्राप्त करें क्या आप अपने कोड पर टिप्पणी करते हैं? सॉकेट ट्रांसपोर्ट "एसएसएल" PHP में सक्षम नहीं है खिड़कियों में पीकेजी कॉन्फ़िग कैसे स्थापित करें? नियमित अभिव्यक्ति सत्यापन में दशमलव या संख्यात्मक मान अंतराल सेट / कुशल ओवरलैप जुड़ने के बीच ओवरलैपिंग ढूँढना HTML5 कैनवास तत्व को अपनी सामग्री के साथ क्लोन करने का कोई तरीका? टेबलव्यू में दो कोशिकाओं के बीच स्थान कैसे देना है? इन (बीकंडिशन == नल) और (नाल == बीकंडशन) के बीच अंतर क्या है? संदर्भ से जावा पास

टंकिनर कैनवास में गेंदें बढ़ाना

यह एक बहुत ही बुनियादी कार्यक्रम है जिसके साथ मैं दो चलती गेंदें बनाना चाहता हूं, लेकिन उनमें से केवल एक वास्तव में चलता है

मैंने कुछ बदलावों की कोशिश की है, लेकिन दूसरी गेंद चलती नहीं जा सकती; एक अन्य संबंधित प्रश्न – कुछ लोग इस लक्ष्य को प्राप्त करने के लिए move(object) विधि का उपयोग करते हैं, जबकि अन्य एक delete(object) और फिर इसे फिर से दोहराते हैं। मैं किस का उपयोग करना चाहिए और क्यों?

यह मेरा कोड है जो केवल एक गेंद को एनिमेटिंग / चलाना है:

 from Tkinter import * class Ball: def __init__(self, canvas, x1, y1, x2, y2): self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2 self.canvas = canvas self.ball = canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill="red") def move_ball(self): while True: self.canvas.move(self.ball, 2, 1) self.canvas.after(20) self.canvas.update() # initialize root Window and canvas root = Tk() root.title("Balls") root.resizable(False,False) canvas = Canvas(root, width = 300, height = 300) canvas.pack() # create two ball objects and animate them ball1 = Ball(canvas, 10, 10, 30, 30) ball2 = Ball(canvas, 60, 60, 80, 80) ball1.move_ball() ball2.move_ball() root.mainloop() 

वेब के समाधान से एकत्रित समाधान "टंकिनर कैनवास में गेंदें बढ़ाना"

आपको जीयूआई प्रोग्राम के अंदर कभी भी अनंत लूप नहीं लगाया जाना चाहिए – पहले से ही एक अनंत लूप चल रहा है। यदि आप अपनी गेंदों को स्वतंत्र रूप से स्थानांतरित करने के लिए चाहते हैं, तो बस पाश को बाहर move_ball और move_ball विधि को ईवेंट लूप पर एक नया कॉल दें। इसके साथ, आपकी गेंदें हमेशा के लिए आगे बढ़ना जारी रखती हैं (जिसका अर्थ है कि आपको ऐसा करने से रोकने के लिए कुछ प्रकार की जांच करनी चाहिए)

मैंने अपने कार्यक्रम को असीमित लूप को हटाकर, एनीमेशन को थोड़ी धीमा कर, और दिशा में चलने के लिए यादृच्छिक मानों का उपयोग करके कुछ भी बदल दिया है। उस परिवर्तन के सभी move_ball विधि के अंदर हैं move_ball

 from Tkinter import * from random import randint class Ball: def __init__(self, canvas, x1, y1, x2, y2): self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2 self.canvas = canvas self.ball = canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill="red") def move_ball(self): deltax = randint(0,5) deltay = randint(0,5) self.canvas.move(self.ball, deltax, deltay) self.canvas.after(50, self.move_ball) # initialize root Window and canvas root = Tk() root.title("Balls") root.resizable(False,False) canvas = Canvas(root, width = 300, height = 300) canvas.pack() # create two ball objects and animate them ball1 = Ball(canvas, 10, 10, 30, 30) ball2 = Ball(canvas, 60, 60, 80, 80) ball1.move_ball() ball2.move_ball() root.mainloop() 

यह समारोह अपराधी लगता है

 def move_ball(self): while True: self.canvas.move(self.ball, 2, 1) self.canvas.after(20) self.canvas.update() 

जब आप इसे कहते हैं, आप जानबूझ कर अपने आप को अनंत लूप में डालते हैं।

 ball1.move_ball() # gets called, enters infinite loop ball2.move_ball() # never gets called, because code is stuck one line above 

इसका एकमात्र चलना क्योंकि प्रोग्राम एक समय में केवल एक चर को पढ़ता है। यदि आप प्रोग्राम को पढ़ने के लिए सेट करते हैं, तो गेंद को किसी खास स्थान पर ले जाता है, तो कैनवास के अंत का कहना है, तो आप अगले लाइन को पढ़ने के लिए कार्यक्रम को कोडित कर सकते हैं और दूसरी गेंद को स्थानांतरित करने के लिए ट्रिगर कर सकते हैं। लेकिन, यह केवल एक समय में एक ही स्थानांतरित होगा

आपका प्रोग्राम वाकई लाइन पर अटक गया है:

ball1.move_ball()

और यह लाइन पर कभी नहीं मिलेगा:

ball2.move_ball()

क्योंकि इसमें कोई सीमा नहीं है जहां लूप समाप्त होना चाहिए।

अन्यथा, "सुंदर नटराज" का जवाब ऐसा करेगा।

self.canvas.move(self.ball, 2, 1) बजाय उपयोग करें

 self.canvas.move(ALL, 2, 1) 

यह सब कैनवास में सभी वस्तुओं को स्थानांतरित करने के लिए प्रयोग किया जाता है