2010-09-13 7 views
13

मैं एक बिल्ड पुनर्प्राप्ति फ़ॉर्म बनाने की कोशिश कर रहा हूं, और बटन के साथ समस्याएं प्रतीत होती हैं ... मैं पाइथन/टिंकर जीयूआई प्रोग्रामिंग (और सामान्य रूप से जीयूआई प्रोग्रामिंग) में एक नौसिखिया हूं और हैलो वर्ल्ड के कंकाल को उधार लिया ऐप, और सॉर्टा ने इसे बनाया।टिंकर बटन कमांड प्रोग्राम चलाने पर सक्रिय करता है?

नीचे दिए गए कोड में, मैंने क्लिक किए जाने पर अपने वर्ग के आंतरिक get_dir() फ़ंक्शन को कॉल करने के लिए अपने ब्राउज़ बटन के "कमांड" विकल्प को सेट किया है। हालांकि, जैसे ही मैं ऐप चलाने का प्रयास करता हूं, get_dir() फ़ंक्शन को कॉल किया जाता है और मुझे निर्देशिका चुनने के लिए कहा जाता है। ऐसा कोई विचार क्यों होता है, और यह ठीक से व्यवहार करने के लिए मैं क्या कर सकता हूं?

from Tkinter import * 
import tkFont 
from tkFileDialog import askdirectory 

class App: 

    def __init__(self, master): 

     fontHead = tkFont.Font(family="Arial", size=10, weight=tkFont.BOLD) 
     fontBold = tkFont.Font(family="Arial", size=8, weight=tkFont.BOLD) 
     fontReg = tkFont.Font(family="Arial", size=8) 

     frameN = Frame(master) 
     frameN.grid(row=0,padx=5,pady=5) 

     frameXBH = Frame(frameN) 
     frameXBH.grid(row=0,columnspan=5,padx=5) 

     Canvas(frameXBH,borderwidth=0,relief="flat",height=1,width=20,background="#cccccc").grid(row=0) 
     Label(frameXBH, text="Xbox 360",font=fontBold,width=9).grid(row=0,column=1) 
     Canvas(frameXBH,borderwidth=0,relief="flat",height=1,width=440,background="#cccccc").grid(row=0,column=2,sticky="WE") 

     Label(frameN, text="Destination Path:",font=fontReg).grid(row=1,sticky="W") 
     xbPath = Entry(frameN,width=30,font=fontReg) 
     xbPath.grid(row=1,column=1,sticky="W") 
     xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir(xbPath)) 
     xbBrowse.grid(row=1,column=2,sticky="W") 
     xbRel = Checkbutton(frameN,text="Release",font=fontReg) 
     xbRel.grid(row=1,column=3,sticky="W") 
     xbShip = Checkbutton(frameN,text="Ship",font=fontReg) 
     xbShip.grid(row=1,column=4,sticky="W") 

     Canvas(frameN,borderwidth=1,relief="groove",width=550,height=0).grid(row=2,columnspan=5,pady=10) 

     # SAVE AND CANCEL 

     btnSave = Button(frameN,text="Save",width=10) 
     btnSave.grid(row=3,column=3,sticky="E") 

     btnCancel = Button(frameN,text="Cancel",width=10) 
     btnCancel.grid(row=3,column=4,sticky="W") 

    def get_dir(self,box): 
     tmp = askdirectory(mustexist=1,title="Please select a destination") 
     tmp = tmp.replace("/","\\") 
     box.delete(0,END) 
     box.insert(0,tmp) 

root = Tk() 
root.resizable(0,0) 

app = App(root) 

root.mainloop() 
+0

संभावित डुप्लिकेट

self.xbPath = Entry(frameN,width=30,font=fontReg) 

फिर अपने get_dir() विधि की तरह दिखाई देगा [घोषित होने पर बटन पैरामीटर "कमांड" निष्पादित क्यों किया जाता है?] (http://stackoverflow.com/questions/5767228/why-i एस-बटन-पैरामीटर-कमांड-निष्पादित-कब-घोषित) – nbro

+0

@ एनब्रो मुझे लगता है कि आपके पास डुप्लिकेट पीछे है, मैंने 2010 में यह पूछा था, जिसे आप इसे डुप्लिकेट कर रहे हैं, 2011 -_- –

+0

में पूछा गया था कारण मैं इस पोस्ट को दूसरे के डुप्लिकेट के रूप में चिह्नित करता हूं क्योंकि दूसरे में वास्तव में अधिक जानकारी होती है और वह प्रश्न सरल होता है .. – nbro

उत्तर

17

करें कि आपके ईवेंट हैंडलर एक लैम्ब्डा समारोह, जो जो भी तर्क के साथ अपने get_dir() कॉल आप चाहते हैं:

xbBrowse = Button(frameN, text="Browse...", font=fontReg, command=lambda : self.get_dir(xbPath)) 
+1

क्या आप व्याख्या कर सकते हैं कि यह लैम्ब्डा भाग जोड़कर क्या कर रहा है? मेरे पास टिंकर डॉक्स में न्यूनतम एप्लिकेशन के साथ यह समस्या थी, जहां बटन दबाए जाने पर मैं विंडो में टेक्स्ट जोड़ना चाहता था।मेरे पास कमांड = label.grid() था जब यह एक लेबल जोड़ रहा था, और लम्बा इसे जोड़ दिया। लैम्बडा के बिना आदेश तुरंत क्यों निष्पादित किया गया था? लैम्ब्डा कीवर्ड क्या कर रहा है? – Matt

5

उपरोक्त कोड में:

xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir) 
+0

आह, मैं देखता हूं! अब यह पता लगाने के लिए कि फ़ंक्शन में पैरामीटर कैसे पास करें ... –

+1

@ डॉकटर जे: आपको अपने xbPath के संदर्भ को पारित करने की आवश्यकता नहीं है, मेरे उत्तर – volting

3

आप अपने get_dir के संदर्भ पारित करने के लिए की जरूरत है:

xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir(xbPath)) 

आप पहले से ही समारोह लागू कर रहे हैं, तो आप बस समारोह गुजर जाना चाहिए विधि

तो

बदलें 0
xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir(xbPath)) 

xbBrowse = Button(frameN,text="Browse...",font=fontReg, command=self.get_dir) 

को फिर बनाने के अपने Entry एक उदाहरण चर विजेट ताकि आप अपने get_dir विधि में पहुँच सकते हैं।

उदा।

def get_dir(self): 
    tmp = askdirectory(mustexist=1,title="Please select a destination") 
    tmp = tmp.replace("/","\\") 

    self.xbPath.delete(0,END) 
    self.xbPath.insert(0,tmp) 
+0

पर मेरा ध्यान रखें कि मेरा एक से अधिक ब्राउज़ बटन/एंट्री है हालांकि, इसलिए मुझे कई बटनों को get_dir() कॉल करने की आवश्यकता है और इसे उचित प्रविष्टि फ़ील्ड पास करें ... आप यह कैसे करेंगे? –

+0

@ डॉकटर जे: प्रत्येक घटना के लिए अलग-अलग हैंडलर का पारंपरिक तरीका है, इसलिए आपके मामले में प्रत्येक ब्राउज़ बटन के लिए एक अलग get_dir() विधि है या वैकल्पिक रूप से आप अपने ब्राउज़ बटन + एंट्री विजेट + को कार्यान्वित कर सकते हैं। समग्र विजेट और यह स्वचालित रूप से आपके द्वारा की जाने वाली सभी सामग्री को करता है, यानी इसे पथ प्रक्रिया प्राप्त करने के लिए इसे प्राप्त करें। फिर यह आपके समग्र विजेट्स के कई उदाहरणों को बनाने के समान सरल है। – volting

संबंधित मुद्दे