You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:20:22