Mac系统下PyCharm/终端运行Tkinter时组件不显示问题求助
问题根因&解决方案
第一版代码问题修复
- 你创建的
form容器(ttk.Frame实例)没有调用布局方法挂载到根窗口上,内部所有组件自然不可见 - 根窗口
root无需调用grid()方法,该方法仅用于子组件布局
对应修复后的第一版逻辑代码:
import tkinter from tkinter import ttk class View: def __init__(self, model): self.root = tkinter.Tk() self.root.title("Play Suduko") # 移除无效的root.grid()调用 self.form = ttk.Frame(self.root, padding=10) # 新增:将form容器挂载到根窗口 self.form.grid(row=0, column=0) self.model = model self.S = self.model.S for self.i, self.row in enumerate(self.S): for self.j, self.element in enumerate(self.row): if self.element != 0: self.label = ttk.Label(self.form, text=str(self.element)) self.label.grid(row=self.i, column=self.j) self.root.mainloop()
第二版代码问题修复
- 错误使用
textvariable参数:该参数仅接受Tkinter内置的StringVar/IntVar等变量对象,直接传入普通字符串会导致文本无法渲染,应改为使用text参数 - 你继承了
Frame类但没有实际使用该实例,属于无效冗余代码
对应修复后的第二版逻辑代码:
from tkinter import * from tkinter.ttk import * class View: def __init__(self, model): self.root = Tk() self.root.title("Play Suduko") self.model = model self.S = self.model.S for self.i, self.row in enumerate(self.S): for self.j, self.element in enumerate(self.row): if self.element != 0: # 将textvariable改为text参数 self.label = Label(self.root, text=str(self.element), width=2) self.label.grid(row=self.i, column=self.j, padx=10, pady=10) self.root.mainloop()
兼容Mac High Sierra的额外调整
如果修复后仍存在组件渲染空白的情况,是该版本Mac系统内置的Tk库对ttk组件兼容问题,可以把所有ttk.Label/ttk.Frame替换为原生的tkinter.Label/tkinter.Frame即可正常显示。
内容的提问来源于stack exchange,提问作者MickeyMouse
相关产品推荐
相关产品推荐

