2012-04-03 14 views
12

"Good-bye" लेबल वाले बटन के साथ एक जीयूआई एप्लीकेशन लिखें। जब Button क्लिक किया गया है, तो विंडो बंद हो जाती है।बटन दबाकर टिंकर विंडो को कैसे बंद करें?

यह मेरा कोड अब तक है, लेकिन यह काम नहीं कर रहा है। क्या कोई मेरे कोड के साथ मेरी मदद कर सकता है?

from Tkinter import * 

window = Tk() 

def close_window (root): 
    root.destroy() 

frame = Frame(window) 
frame.pack() 
button = Button (frame, text = "Good-bye.", command = close_window) 
button.pack() 

window.mainloop() 
+4

हे मैट। स्पष्ट प्रश्न रखने के लिए धन्यवाद, और साथ में एक साफ और सरल कोड उदाहरण। क्या आप भविष्य में ट्रेसबैक (क्रैश) को भी शामिल कर सकते हैं जब आपका कोड "काम नहीं कर रहा है"? इससे लोगों को लगभग तुरंत पता चल जाएगा कि आपके कोड का कौन सा हिस्सा टूटा हुआ है। जाहिर है, इस मामले में, आपका कोड नमूना इतना छोटा है कि इसकी पहचान करना आसान हो, लेकिन यह वास्तव में कठिन स्थितियों पर भविष्य में जवाब पाने में आपकी सहायता कर सकता है। – jdi

+0

किसी को भी तुरंत समस्या को देखने के लिए, त्रुटि 'TypeError: close_window() गायब 1 आवश्यक स्थितित्मक तर्क:' root'' है। इसका मतलब है कि कॉलबैक 'close_window' को कोई तर्क नहीं दिया गया था, क्योंकि' command = 'फ़ंक्शंस के लिए कभी भी नहीं है। बाउंड इवेंट कॉलबैक को तर्क मिलता है - ईवेंट ऑब्जेक्ट। –

उत्तर

7

आप एक वर्ग है, कि अपनी command विशेषता को destroy विधि संबद्ध कर अपनी विंडो को बंद करने विशेषज्ञता प्राप्त हो जाएगा कि Tkinter Button वर्ग फैली बना सकते हैं:

from tkinter import * 

class quitButton(Button): 
    def __init__(self, parent): 
     Button.__init__(self, parent) 
     self['text'] = 'Good Bye' 
     # Command to close the window (the destory method) 
     self['command'] = parent.destroy 
     self.pack(side=BOTTOM) 

root = Tk() 
quitButton(root) 
mainloop() 

यह आउटपुट है:

enter image description here


और कारण से पहले क्यों अपने कोड काम नहीं किया:

def close_window(): 
    # root.destroy() 
    window.destroy() 

मैं एक मामूली लग रहा है तो आप कुछ अन्य जगह से जड़ मिल सकता है, जब से तुम window = tk() किया था।

जब आप Tkinter में window पर नष्ट करने का मतलब है, पूरे आवेदन को नष्ट करने के लिए अपने window (रूट विंडो) के रूप में फोन आवेदन के लिए मुख्य विंडो है। आईएमएचओ, मुझे लगता है कि आपको अपना windowroot बदलना चाहिए।

def close_window(root): 
    root.destroy() 

def close_window(): 
    window.destroy() 

करने और यह काम करना चाहिए:

from tkinter import * 

def close_window(): 
    root.destroy() # destroying the main window 

root = Tk() 
frame = Frame(root) 
frame.pack() 

button = Button(frame) 
button['text'] ="Good-bye." 
button['command'] = close_window 
button.pack() 

mainloop() 
20
अपने कोड को कम से कम संपादन (सुनिश्चित नहीं हैं कि अगर वे अपने पाठ्यक्रम में वर्गों सिखाया है या नहीं है), परिवर्तन के साथ


स्पष्टीकरण:

close_window का संस्करण एक भी तर्क, अर्थात् root की उम्मीद परिभाषित किया गया है। इसके बाद, close_window के आपके संस्करण के लिए कोई भी कॉल उस तर्क की आवश्यकता है, या पायथन आपको रन-टाइम त्रुटि प्रदान करेगा।

जब आपने Button बनाया था, तो आपने क्लिक किए जाने पर close_window चलाने के लिए बटन को बताया था। हालांकि, बटन विजेट के लिए स्रोत कोड की तरह कुछ है:

# class constructor 
def __init__(self, some_args, command, more_args): 
    #... 
    self.command = command 
    #... 

# this method is called when the user clicks the button 
def clicked(self): 
    #... 
    self.command() # Button calls your function with no arguments. 
    #... 

मेरी कोड राज्यों के रूप में, Button वर्ग कोई तर्क के साथ अपने कार्य को कॉल करेंगे। हालांकि आपका कार्य एक तर्क की उम्मीद कर रहा है। इस प्रकार आपको एक त्रुटि हुई।

def close_window(): 
    root.destroy() 

सही नहीं है यही कारण है कि, हालांकि, या तो, क्योंकि root एक मूल्य सौंपा कभी नहीं किया गया है: तो, अगर हम चाहते हैं कि तर्क बाहर ले, ताकि समारोह कॉल बटन वर्ग के अंदर निष्पादित करेगा, हम साथ छोड़ रहे हैं।यह print(x) में टाइपिंग की तरह होगा जब आपने x को अभी तक परिभाषित नहीं किया है।

अपने कोड को देखते हुए, मैं तुम्हें window पर destroy फोन करना चाहता था लगा, तो मैं window को root बदल दिया है।

1

आप close_window कार्य करने के लिए तर्क के रूप में window ऑब्जेक्ट के संदर्भ पारित करने के लिए lambda उपयोग कर सकते हैं:

button = Button (frame, text="Good-bye.", command = lambda: close_window(window)) 

यह काम करता है क्योंकि command विशेषता एक प्रतिदेय, या वस्तु की तरह प्रतिदेय उम्मीद कर रही है। ए lambda एक कॉल करने योग्य है, लेकिन इस मामले में यह अनिवार्य रूप से सेट पैरामीटर के साथ दिए गए फ़ंक्शन को कॉल करने का परिणाम है।

संक्षेप में, आप फ़ंक्शन के लैम्ब्डा रैपर को कॉल कर रहे हैं जिसमें कोई तर्क नहीं है, न कि फ़ंक्शन स्वयं।

6

आप सीधे अपने button की command विशेषता के समारोह वस्तु window.destroy संबद्ध कर सकते हैं:

button = Button (frame, text="Good-bye.", command=window.destroy) 

इस तरह से आप आप के लिए विंडो को बंद करने समारोह close_window जरूरत नहीं होगी।

-1
from tkinter import * 

def close_window(): 
    import sys 
    sys.exit() 

root = Tk() 

frame = Frame (root) 
frame.pack() 

button = Button (frame, text="Good-bye", command=close_window) 
button.pack() 

mainloop() 
संबंधित मुद्दे