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

使用OOP开发Tkinter GUI时报无默认根窗口RuntimeError求助

报错原因与解决方案

直接报错原因

你遇到的RuntimeError: Too early to run the main loop: no default root window报错,核心是没有先实例化你定义的App主窗口类,就直接调用了全局mainloop(),Tk找不到可运行的根窗口对象,所以抛出该错误。

修复入口代码即可解决该报错:

if __name__ == '__main__':
    # 先实例化主窗口
    app = App()
    # 调用窗口实例的mainloop方法
    app.mainloop()

其余需修复的代码问题

仅修改入口代码后仍然会触发其他报错,需同步修改以下问题:

  • tk.Tk初始化传参错误:tk.Tk.__init__(self, address_list)中多余传入了address_list类,tk.Tk初始化不需要该参数,修改为tk.Tk.__init__(self)即可。
  • 窗口标题设置错误:self.title = "Address Book Interface"是给App实例新增了一个名为title的属性,而非设置窗口标题,正确写法为self.title("Address Book Interface")。
  • 联系人列表语法错误:['Roy Mustang' '071 5173 4259']行两个字符串之间缺少逗号,会自动拼接为单个字符串,后续解包时报错,补充逗号改为['Roy Mustang', '071 5173 4259']。
  • 方法参数冗余:你定义的add_contact、select_set等方法都强制要求传入contact_list参数,但全局已经定义了该变量,要么将其设为App实例属性,要么直接移除所有方法的contact_list传参要求,避免参数缺失报错。
  • 控件与残留代码问题:你没有定义名为select的列表控件,且select_set方法中存在enter、code、hereselect等无效残留代码,需要补充创建列表控件,删除无效代码。

修复后可运行参考代码

from tkinter import *
import tkinter as tk
from tkinter import ttk

contact_list = [
    ['Dermot Bruce', '071 0403 6313'],
    ['Felix Kent', '071 7050 4862'],
    ['Eren Yeager', '071 4174 1560'],
    ['Roy Mustang', '071 5173 4259'],
    ['Arietta Curtis', '071 4415 8004'],
    ['Jennifer Love', '071 8857 1196'],
]


class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.title("Address Book Interface")
        self.geometry('400x400')
        self.resizable(0, 0)
        self.config(bg='lightblue')

        self.name = StringVar()
        self.number = StringVar()
        # 创建框架
        self.frame = Frame(self)
        self.frame.pack(side=RIGHT, padx=10, pady=10)
        # 补充创建联系人列表展示控件
        self.select = Listbox(self.frame, width=30, height=15)
        self.select.pack()

        def add_contact():
            contact_list.append([self.name.get(), self.number.get()])
            select_set()

        def edit():
            if not self.select.curselection():
                return
            selected_idx = self.select.curselection()[0]
            contact_list[selected_idx] = [self.name.get(), self.number.get()]
            select_set()

        def view():
            if not self.select.curselection():
                return
            selected_idx = self.select.curselection()[0]
            NAME, PHONE = contact_list[selected_idx]
            self.name.set(NAME)
            self.number.set(PHONE)

        def delete():
            if not self.select.curselection():
                return
            selected_idx = self.select.curselection()[0]
            del contact_list[selected_idx]
            select_set()

        def reset():
            self.name.set('')
            self.number.set('')

        def exit_app():
            self.destroy()

        def select_set():
            contact_list.sort()
            self.select.delete(0, END)
            for name, phone in contact_list:
                self.select.insert(END, name)

        select_set()


if __name__ == '__main__':
    app = App()
    app.mainloop()

内容的提问来源于stack exchange,提问作者D10

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:24:03