为何我的Tkinter类初始化后无窗口输出?
问题与解答
代码示例
import tkinter as tk class Display: # 初始化窗口及设置 def __init__(self): self.root = tk.Tk() self.root.title("Quote Finder") self.root.geometry("300x300") self.root.resizable(False, False) self.root.configure(bg = "white") # 创建程序所需的框架 def frames(self): self.search_frame = tk.LabelFrame(self.root, bg = "white") self.search_frame.grid(row = 1, column = 0, columnspan = 3) self.quote_frame = tk.LabelFrame(self.root, bg = "white", padx = 10, pady = 10) self.quote_frame.grid(row = 5, column = 1) # 创建用于生成/查找名言的组件 def heading(self, random, search): self.title = tk.Label(self.root, text = "Quote Finder", bg = "white") self.title.grid(row = 0, column = 0, columnspan = 3) self.search_bar = tk.Entry(self.search_frame) self.search_bar.grid(row = 0, column = 0, ipadx = 30) self.search_bar.insert(0, "enter a tag that describes the quote") self.search_button = tk.Button(self.search_frame, text = "Search", command = lambda: search) self.search_button.grid(row = 0, column = 1) self.empty_row1 = tk.Label(self.root, text = "", bg = "white") self.empty_row1.grid(row = 2, column = 0, columnspan = 3) self.random_button = tk.Button(self.root, text = "Generate Random Quote", command = lambda: random) self.random_button.grid(row = 3, column = 0, sticky = "w", columnspan = 3) self.empty_row2 = tk.Label(self.root, text = "", bg = "white") self.empty_row2.grid(row = 4, column = 0) # 创建名言展示及滚动组件 def quote_display(self, next, back): self.quote_label = tk.Label(self.quote_frame, text = "Quote", bg = "white") self.quote_label.grid(row = 0, column = 0) self.next_button = tk.Button(self.root, text = ">", command = next) self.next_button.grid(row = 6, column = 1, sticky = "e") self.back_button = tk.Button(self.root, text = "<", command = back) self.back_button.grid(row = 6, column = 1, sticky = "w") display = Display()
问题
我尝试测试该类的__init__函数,但没有任何输出,请问这是为什么?我已在不同文件中运行同一程序,但仍然无法正常工作。另外我是在repl.it上编写代码,不确定是否是平台本身的问题。
解答
核心原因
- 缺少Tkinter主事件循环:Tkinter创建窗口后,必须调用
mainloop()启动事件循环,否则窗口会在创建后立即销毁,你根本看不到界面。你的代码仅实例化了Display类,却没有触发事件循环。 - 未调用控件创建方法:
frames、heading、quote_display方法负责创建所有界面控件,但这些方法完全没被调用——就算启动了事件循环,也只会显示一个空白窗口。
修复方案
修改代码,在实例化后添加事件循环调用,同时调用所有必要的控件创建方法,以下是两种可行方式:
方式一:在__init__中自动调用控件方法
修改Display类的__init__方法,在末尾调用控件创建方法(注意给heading和quote_display传占位函数,后续可替换为实际业务逻辑):
def __init__(self): self.root = tk.Tk() self.root.title("Quote Finder") self.root.geometry("300x300") self.root.resizable(False, False) self.root.configure(bg = "white") # 调用控件创建方法 self.frames() # 传入占位函数,后续可替换为实际的搜索、随机生成逻辑 self.heading(lambda: None, lambda: None) self.quote_display(lambda: None, lambda: None)
然后在实例化后启动主循环:
display = Display() display.root.mainloop()
方式二:实例化后手动调用所有方法
保持原类代码不变,修改实例化部分:
display = Display() # 调用控件创建方法 display.frames() display.heading(lambda: None, lambda: None) display.quote_display(lambda: None, lambda: None) # 启动主事件循环 display.root.mainloop()
关于repl.it平台
repl.it支持Tkinter,只要项目环境是Python,依赖会自动加载。按上述方式修复代码后即可正常显示窗口,和平台本身关系不大。
内容的提问来源于stack exchange,提问作者Dylan Scully
相关产品推荐
相关产品推荐

