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

使用Tkinter开发计算器时按钮位置触发‘bad screen distance’错误

解决Tkinter按钮定位的_tkinter.TclError错误

错误原因

_tkinter.TclError: bad screen distance "25 25"的核心问题是**button_positions数组结构混乱**:

  • 初始元素是单个坐标元组(如(0,25)),对应单个按钮位置
  • 后续通过append添加的是包含多个坐标元组的列表(如[(25,25),(25,50),(25,100)])
  • 循环到第4个按钮时,position_t = button_positions[i]拿到的是整个列表,position_t[0]会返回(25,25)这个元组,传给place(x=x,y=y)时,元组被转为字符串"25 25",而Tkinter要求x/y参数为单个数值,因此触发错误。

另外代码同时使用button.pack()和button.place()两种布局方法,会导致布局逻辑冲突,进一步加剧问题。

修正方案

步骤1:统一坐标数组结构

将button_positions调整为一维数组,每个元素对应一个按钮的(x,y)坐标元组,确保数量与数字按钮(10个)匹配:

button_positions = [
    (0,25), (0,50), (0,100),
    (25,25), (25,50), (25,100),
    (50,25), (50,50), (50,100),
    (75,25)  # 对应0按钮的位置
]

步骤2:移除冲突的布局方法

删掉button.pack(),因为place()是精确坐标定位,不需要pack()的流式布局逻辑。

修正后的完整代码

from tkinter import *

class GraphicsInterface:

    def __init__(self):
        self.window = Tk()
        self.window.geometry("720x500")

        self.clicked=[]

        numbers = [1,2,3,4,5,6,7,8,9,0]

        # 统一为一维坐标数组,每个元素对应单个按钮位置
        button_positions = [
            (0,25), (0,50), (0,100),
            (25,25), (25,50), (25,100),
            (50,25), (50,50), (50,100),
            (75,25)
        ]

        i  = 0

        textbox = Text(self.window, width=30, height=2)
        textbox.pack(pady=20)  # 增加内边距避免和按钮重叠

        for n in numbers:
            button = Button(self.window, text=n, width=13)
            button.configure(command=lambda btn=button: self.OnClick(btn,textbox))
            position_t = button_positions[i]
            x = position_t[0]
            y = position_t[1]   

            button.place(x=x, y=y)
            i += 1

        self.window.mainloop()

    def OnClick(self, btn, textbox):
        text = btn.cget("text")
        print(text)
        textbox.insert('end', text)

app = GraphicsInterface()

额外优化提示

如果要实现计算器的网格式布局,推荐使用grid()方法替代place(),代码会更简洁易维护,比如按3列3行排列数字按钮,0按钮单独占一行:

# 示例:用grid布局替代place
row, col = 0, 0
for n in numbers[:9]:
    button = Button(self.window, text=n, width=13)
    button.grid(row=row, column=col, padx=5, pady=5)
    col += 1
    if col == 3:
        col = 0
        row += 1
# 处理0按钮
zero_btn = Button(self.window, text=0, width=13)
zero_btn.grid(row=row, column=0, columnspan=3, padx=5, pady=5)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:24:20