2015-04-07 7 views
5

ओवरराइट करने की अनुमति नहीं है मैं tkinter में एक savefile संवाद करने की कोशिश कर रहा हूँ। मुझे बाद में उपयोग करने के लिए फ़ाइल नाम को सहेजने की जरूरत है। हालांकि, मैं नहीं चाहता कि दायर किया गया पहले से ही मौजूदा फ़ाइल नाम का चयन स्वीकार कर सके।फ़ाइल संवाद के रूप में सहेजें - कैसे

अब तक मैं केवल यह है:

from tkinter import filedialog 

my_file = filedialog.asksaveasfilename(defaultextension = ".myfile", 
             filetypes = [("MY SUPER FILE", ".myfile"), 
                ("All files", ".*")]) 

एक संभावना यह फ़ाइल नाम पाने के लिए किया जाएगा, तो देखें कि यह मौजूद है (os.path.isfile प्रयोग करके) और फिर नए नाम के लिए उपयोगकर्ता से पूछें कि वहाँ पहले से ही एक फाइल है एक ही नाम के साथ। हालांकि, tkinter दाखिलकर्ता उपयोगकर्ता से पूछता है "फ़ाइल पहले से मौजूद है। क्या आप ओवरराइट करना चाहते हैं?"। तो यह भ्रमित लगता है अगर बाद में मैं उपयोगकर्ता को बताता हूं कि मैं फ़ाइल नाम पसंद नहीं करता हूं। क्या उपयोगकर्ता को ओवरराइटिंग के बारे में नहीं पूछने के लिए टिंकटर दायरियल को मजबूर करने का कोई तरीका है?

संपादित करें: उत्तरों में दिए गए सुझावों के आधार पर, मैंने अपना स्वयं का फ़ाइल फ़ाइल संवाद करने का प्रयास किया।

class MySaveFileDialog(filedialog.FileDialog): 

""" File save dialog that does not allow overwriting of existing file""" 
def ok_command(self): 
    file = self.get_selection() 
    if os.path.exists(file): 
     if os.path.isdir(file): 
      self.master.bell() 
      return 
     messagebox.showarning("The current file name already exists. Please give another name to save your file.") 
    else: 
     head, tail = os.path.split(file) 
     if not os.path.isdir(head): 
      self.master.bell() 
      return 
    self.quit(file) 

इसलिए, यह बहुत सरल है:

मैं मूल रूप से केवल संवाद बचाने tkinter के लिए एक चेतावनी गयी। तब मैंने सोचा: मुझे अपना खुद का asksaveasfilename फ़ंक्शन बनाना होगा। मैं स्रोत की जांच करने के लिए चला गया:

def asksaveasfilename(**options): 
"Ask for a filename to save as" 

return SaveAs(**options).show() 

Humm .. मैं क्या SaveAs कर रही है यह देखने के लिए की जरूरत है।

class SaveAs(_Dialog): 
    "Ask for a filename to save as" 

    command = "tk_getSaveFile" 

आॅनंडड ... मैं खो गया हूं। मुझे समझ में नहीं आता कि यह टुकड़े एक साथ कैसे फिट होते हैं। 'SaveAs' में केवल tk_getSaveFile कमांड है। SaveFileDialog का उपयोग यहां कैसे किया जा रहा है? और मैं अपना खुद का myasksaveasfilename फ़ंक्शन कैसे बना सकता हूं?

+1

आप कार्य करें:
यहाँ एक नकली निर्भर है इसकी जरूरत है? गैर-मानक व्यवहार वाले संवाद उपयोगकर्ता को भ्रमित कर रहे हैं। साथ ही, यदि उपयोगकर्ता किसी मौजूदा फ़ाइल को ओवर-लिखना चाहता है तो उन्हें चेतावनी देना अच्छा होता है, लेकिन वास्तव में उन्हें ऐसा करने से रोकने में परेशानी होती है। इसलिए यदि चयनित नाम किसी मौजूदा फ़ाइल से मेल खाता है, तो शायद आप पैर में शूट करने से पहले उन्हें एक आखिरी मौका देने के लिए 'askokcancel' संदेश बॉक्स पॉप अप कर सकते हैं।:) –

+0

@ पीएम 2 रिंग: मैं आपकी चिंता को समझता हूं। और मैं इसे इस तरह से नहीं करना चाहूंगा, लेकिन मुझे वास्तव में इसकी आवश्यकता है :) – zelite

+0

ऐसी समस्याएं जो दो समस्याएं हैं: 1) क्या उपयोगकर्ता को ऐसा करने का दूसरा मतलब है? 2) क्या यह गलती से अधिक स्वेच्छा से इस्तेमाल किया जाएगा? यहां 1) उत्तर हाँ है (आप ऐप के बाहर फ़ाइल को हटा सकते हैं) और 2) उत्तर ऐप के आधार पर निर्भर करता है। –

उत्तर

5

ऐसा कोई विकल्प नहीं है। अगर आप सुरक्षा प्रश्न से छुटकारा पाना चाहते हैं, तो आपको अपना खुद का फाइल डायलॉग लिखना होगा।

यदि आप filedialog.py पर देखते हैं, तो आप देखेंगे कि संवाद पायथन में लागू किया गया है। तो आपको बस SaveFileDialog वर्ग का विस्तार करना है और विधि ok_command() को ओवरराइड करना है जो मौजूदा फ़ाइल नाम का चयन करने की अनुमति नहीं देता है।

आप मौजूदा कोड का उपयोग कर सकते हैं और अपने लक्ष्य को प्राप्त करने के लिए बस कुछ ग्रंथों को बदल सकते हैं।

मैं इसे परीक्षण नहीं किया है, लेकिन इस कोड काम करना चाहिए:

def ok_command(self): 
     file = self.get_selection() 
     if os.path.exists(file): 
      if os.path.isdir(file): 
       self.master.bell() 
       return 
      d = Dialog(self.top, 
         title="Overwrite Existing File Question", 
         text="Overwrite existing file %r?" % (file,), 
         bitmap='questhead', 
         default=1, 
         strings=("Yes", "Cancel")) 
      if d.num != 0: 
       return 
     else: 
      head, tail = os.path.split(file) 
      if not os.path.isdir(head): 
       self.master.bell() 
       return 
     self.quit(file) 
+0

सही दिशा में मुझे इंगित करने के लिए धन्यवाद। – zelite

+0

नोट: फ़ाइल संवाद लिनक्स सिस्टम पर पायथन में लागू किया गया है। विंडोज़ और ओएसएक्स पर यह मूल फ़ाइल संवाद है। –

+0

@ ब्रायन ओकले आप 'फ़ाइलडिअलॉग। सेवफाइलडिअलॉग' से विरासत में प्राप्त कक्षा बना सकते हैं, 'ok_command' को ओवरराइट कर सकते हैं और इसे' fd = MySaveFileDialog (root) ''filename = fd.go()' का उपयोग करके कॉल कर सकते हैं, हालांकि सही है? यद्यपि निश्चित रूप से देशी ओएस संवाद के रूप में कहीं भी सुंदर दिखता है। – fhdrsdg

0

पूरा करने के लिए क्या हारून ने कहा, यहां ok_command की वर्तमान कोड है _really_

import tkFileDialog 
import tkMessageBox as mbox 
class Example(): 
    proceed = False 
    while proceed == False: 
     dlg = tkFileDialog.asksaveasfilename(confirmoverwrite=False) 
     fname = dlg 
     if fname != '': 
      try: 
       f = open(fname, "r") 
       f.close() 
       mbox.showerror("Error","File exists - Choose another file name") 
      except: 
       mbox.showinfo("Info","File does not exist - Continue") 
       proceed = True 
     else: 
      break 
    print("Finished") 
0

आप प्राप्त कर सकते हैं इस का उपयोग करते हुए tkFileDialog.asksaveasfilename(confirmoverwrite=False):

def ok_command(self): 
     file = self.get_selection() 
     if os.path.exists(file): 
      if os.path.isdir(file): 
       self.master.bell() 
       return 
      d = Dialog(self.top, 
         title="Overwrite Existing File", 
         text="You can't overwrite an existing file %r. Please select a new name." % (file,), 
         bitmap='error', 
         default=0, 
         strings=("OK",)) 
      return 
     else: 
      head, tail = os.path.split(file) 
      if not os.path.isdir(head): 
       self.master.bell() 
       return 
     self.quit(file) 
संबंधित मुद्दे

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