调用simpledialog.askstring()时报错:'str' object is not callable
问题描述
调用Tkinter的simpledialog.askstring()时触发TypeError: 'str' object is not callable错误,错误出现在zapisz_punkt()方法的nazwa = sd.askstring('T', "Wpisz nazwę punktu:")行。
错误堆栈显示,问题根源是Toplevel初始化时调用root.title()时,root.title被覆盖成了字符串对象,导致无法调用。已确认正确导入simpledialog模块,其他对话框模块(如messagebox、filedialog)可正常工作,即使在__init__方法中调用该函数也会出现相同错误。
代码片段
class Punkty_Edycja_Frame(ttk.Frame): def __init__(self, parent): super().__init__(parent) self.grid(row = 1, column = 0, sticky='nesw') self.rowconfigure((0, 1, 2), weight=1, uniform='a') self.columnconfigure((0, 1), weight=1, uniform='a') self.punkty_listbox = tk.Listbox() self.punkty = {} #zapisanie punktu ttk.Button(self, text = "Zapisz punkt", command = self.zapisz_punkt ).grid(row = 0, column = 0, sticky='nesw') def pobierz_zmienne_q(self): return (0, 0, 0, 0, 0, 0) def zapisz_punkt(self): nazwa = sd.askstring('T', "Wpisz nazwę punktu:") if nazwa != '' and nazwa != None: self.punkty_listbox.insert(tk.END, nazwa) self.punkty[nazwa] = self.pobierz_zmienne_q() print(self.punkty)
错误堆栈跟踪
Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\me\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 1967, in __call__ return self.func(*args) ^^^^^^^^^^^^^^^^ File "c:\users\me\desktop\aplikacja gui\pusty.py", line 230, in zapisz_punkt nazwa = sd.askstring('T', "Wpisz nazwę punktu:") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\me\AppData\Local\Programs\Python\Python312\Lib\tkinter\simpledialog.py", line 411, in askstring d = _QueryString(title, prompt, **kw) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\me\AppData\Local\Programs\Python\Python312\Lib\tkinter\simpledialog.py", line 388, in __init__ _QueryDialog.__init__(self, *args, **kw) File "C:\Users\me\AppData\Local\Programs\Python\Python312\Lib\tkinter\simpledialog.py", line 283, in __init__ Dialog.__init__(self, parent, title) File "C:\Users\me\AppData\Local\Programs\Python\Python312\Lib\tkinter\simpledialog.py", line 109, in __init__ Toplevel.__init__(self, master) File "C:\Users\me\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 2700, in __init__ self.title(root.title()) ^^^^^^^^^^^^ TypeError: 'str' object is not callable
解决方案
错误根源是你在主程序中错误地将Tk根窗口的title方法覆盖成了字符串。比如你可能写了:
root = tk.Tk() root.title = "Moja Aplikacja" # 错误写法,覆盖了title方法
而正确的设置窗口标题的方式应该是调用方法:
root = tk.Tk() root.title("Moja Aplikacja") # 正确写法,调用title方法
当root.title被覆盖为字符串后,simpledialog在创建Toplevel窗口时,会尝试调用root.title()获取当前标题,此时就会触发str对象不可调用的错误。
检查你的主程序代码,找到所有对root.title的赋值语句,改成调用方法的形式即可解决问题。
内容的提问来源于stack exchange,提问作者Radar32
相关产品推荐
相关产品推荐

