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

Tkinter骰子模拟器:Text组件无法在Frame内定位求助

解决Tkinter中Text组件在Frame内的定位问题

我正尝试用Python的Tkinter库开发一个“骰子模拟器”,但当我试图将Text组件定位到它的Frame容器内时,它始终固定在Frame的左上角。我已经尝试了grid、move和place方法,但都不起作用。

原代码

from tkinter import *
from random import *
def roll():
    txt.delete(0.0, END)
    txt.insert(END, str(randint(1,6)))
window = Tk()
window.title('Dice simulator')
canvas = Canvas(window, width=800, height=500, bg='brown')
canvas.pack()
dice = canvas.create_rectangle(375, 225, 425, 275, fill='white')
frame = Frame(canvas, width=25, height=15)
window = canvas.create_window(400, 295, window=frame)
txtframe = Frame(canvas, width=50, height=50)
txtwindow = canvas.create_window(400, 250, window=txtframe, width=49, height=49)
txt = Text(txtframe, font=50)                                                                                                                                         
button = Button(frame, text='Roll', command=roll)
button.pack()
txt.pack()

问题分析与修复方案

  • 变量名冲突:你将canvas.create_window的返回值赋值给了window,覆盖了主窗口对象,会导致后续潜在问题,需修改变量名避免冲突。
  • Frame尺寸不生效:Tkinter的Frame默认会根据内部组件自动调整大小,你设置的width和height被忽略,需要用pack_propagate(False)禁用自适应。
  • Text组件未居中:默认pack()会让组件贴紧左上角,通过添加expand=True和anchor=CENTER参数可实现居中,或用fill=BOTH让Text填满Frame。

修改后的完整代码

from tkinter import *
from random import randint

def roll():
    txt.delete(0.0, END)
    txt.insert(END, str(randint(1,6)))

# 主窗口
root = Tk()
root.title('Dice simulator')

canvas = Canvas(root, width=800, height=500, bg='brown')
canvas.pack()

# 绘制骰子外框
dice = canvas.create_rectangle(375, 225, 425, 275, fill='white')

# 按钮容器Frame
btn_frame = Frame(canvas, width=25, height=15)
button_window = canvas.create_window(400, 295, window=btn_frame)
button = Button(btn_frame, text='Roll', command=roll)
button.pack()

# 文本容器Frame
txt_frame = Frame(canvas, width=50, height=50)
# 禁用Frame尺寸自适应,保持设置的宽高
txt_frame.pack_propagate(False)
txt_window = canvas.create_window(400, 250, window=txt_frame, width=49, height=49)

# 配置Text组件,设置字体大小并居中显示
txt = Text(txt_frame, font=('Arial', 20), justify=CENTER)
# expand=True允许Text利用Frame的可用空间,anchor=CENTER实现居中
txt.pack(expand=True, anchor=CENTER)

root.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:05:26