使用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
相关产品推荐
相关产品推荐

