2015-09-06 121 views
-1

我在问我的问题之前已经查看了这个,但一直没有找到符合我的情况的东西。Python TypeError:不支持的操作数类型为+:'NoneType'和'str'

我正在写一个Python程序 - 一个文本编辑器;使用Python和Gtk + 3。

这是我得到的错误:

Traceback (most recent call last): 
    File "file.py", line 58, in on_s_pressed 
    if (self.set_title == (filename + " - DeSedit")): 
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str' 

这里是我的代码:

#!/usr/bin/env python3 

from gi.repository import Gtk, Gdk 

class DeSedit(Gtk.Window): 
    def __init__(self): 
     Gtk.Window.__init__(self, title="DeSedit") 

    self.set_default_size(650, 500) 

    # keyboard shortcuts 
    """ <Control>O """ 
    accel = Gtk.AccelGroup() 
    accel.connect(Gdk.keyval_from_name('O'), Gdk.ModifierType.CONTROL_MASK, 0, self.on_o_pressed) 
    self.add_accel_group(accel) 
    """ <Control>S """ 
    accel1 = Gtk.AccelGroup() 
    accel1.connect(Gdk.keyval_from_name('S'), Gdk.ModifierType.CONTROL_MASK, 0, self.on_s_pressed) 
    self.add_accel_group(accel1) 

    # grid to organize widgets 
    self.box = Gtk.Box() 
    self.add(self.box) 
    # text view 
    self.textview = Gtk.TextView() 
    self.textview.set_wrap_mode(True) 
    self.textbuffer = self.textview.get_buffer() 
    # scroll bar 
    scrollwindow = Gtk.ScrolledWindow() 
    scrollwindow.add(self.textview) 
    self.box.pack_start(scrollwindow, True, True, 0) 

# open file dialog 
def on_o_pressed(self, *args): 
    openDialog = Gtk.FileChooserDialog("Select file to be opened", self, 
     Gtk.FileChooserAction.OPEN, 
     (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, 
     Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) 
    response = openDialog.run() 
    if response == Gtk.ResponseType.OK: 
     filename = openDialog.get_filename() 
     with open(filename, 'r') as fRead: 
      data = fRead.read() 
      self.textbuffer.set_text(data) 
      self.set_title(filename + " - DeSedit") 
      fRead.close() 
     openDialog.destroy() 
    elif response == Gtk.ResponseType.CANCEL: 
     openDialog.destroy() 

# save file dialog 
def on_s_pressed(self, *args): 
    saveDialog = Gtk.FileChooserDialog("Select folder to save file", self, 
     Gtk.FileChooserAction.SAVE, 
     (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, 
     Gtk.STOCK_SAVE, Gtk.ResponseType.OK)) 
    filename = saveDialog.get_filename() 
    if self.set_title == (filename + " - DeSedit"): 
     print("hmm") 
    response = saveDialog.run() 
    if response == Gtk.ResponseType.OK: 

     with open(filename, 'w') as fWrite: 
      data = self.textbuffer.get_text(self.textbuffer.get_start_iter(), 
              self.textbuffer.get_end_iter(), True) 
      fWrite.write(data) 
      fWrite.close() 
     saveDialog.destroy() 
    elif response == Gtk.ResponseType.CANCEL: 
     saveDialog.destroy() 



window = DeSedit() # create DeSedit object 
window.connect("delete-event", Gtk.main_quit) 
window.show_all() 
Gtk.main() 
+0

这样看来,'saveDialog.get_filename()'将返回无。 –

+1

这一个不提供[mcve](ref:http://meta.stackoverflow.com/q/306049/3001761) – jonrsharpe

回答

1

你的文件名从这里走过:

filename = saveDialog.get_filename() 

函数返回None出于某种原因(可能是因为用户取消了对话框 - 当您取消Tkinter文件对话框时,您将获得一个空格y字符串),然后试图将它与一个字符串结合起来,这是无法完成的。放入一些错误处理代码来处理没有选择文件名的情况,如if not filename: return或其他。

2

它基本上告诉你filename是一个NoneType对象,意思是saveDialog.get_filename()返回None

根据the doc这意味着没有文件被选中

gtk.FileChooser.get_filename

def get_filename()

Returns : The currently selected filename, or None if no file is >selected, or the selected file can't be represented with a local filename.

相关问题