簡體   English   中英

Python TypeError:+不支持的操作數類型:'NoneType'和'str'

[英]Python TypeError: unsupported operand type(s) for +: 'NoneType' and '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()

它基本上告訴您filename是一個NoneType對象,這意味着saveDialog.get_filename()返回None

根據文檔,這意味着未選擇文件

gtk.FileChooser.get_filename

def get_filename()

返回:當前選定的文件名;如果未選擇任何文件,則返回None;否則所選文件不能用本地文件名表示。

您的文件名來自這里:

filename = saveDialog.get_filename()

該函數由於某種原因(可能是由於用戶取消了對話框-當您取消Tkinter文件對話框時,您得到一個空字符串)而返回None ,然后嘗試將其與字符串組合,這是無法完成的。 放入一些錯誤處理代碼以處理未選擇文件名的情況,例如if not filename: return選擇if not filename: return或其他內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM