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

CustomTkinterMessagebox报错:bad screen distance "100.0" 求助

问题分析

报错_tkinter.TclError: bad screen distance "100.0"的核心原因是Tkinter组件的尺寸参数必须为整数,但CTkMessagebox初始化时传递了浮点数类型的height参数(由self.height/2计算得到)。而draw_pre_attack_network函数中的matplotlib绘图操作干扰了Tkinter窗口的尺寸计算上下文,导致CTkMessagebox获取到的self.height为浮点数。

解决方案

方案1:强制指定CTkMessagebox的整数尺寸

调用CTkMessagebox时手动传入整数类型的height参数,避免浮点数问题:

# 直接指定固定整数值
CTkMessagebox(master=app, title="Error", message="The number of simulations is not set!", icon="warning", height=200)

或者根据主窗口高度动态计算整数高度:

# 先获取主窗口高度并转为整数,再计算弹窗高度
app_height = int(app.winfo_height())
CTkMessagebox(master=app, title="Error", message="The number of simulations is not set!", icon="warning", height=app_height//2)

方案2:修复CTkMessagebox源码的浮点数问题

找到CTkMessagebox的源码文件(路径:/home/pira/.local/lib/python3.10/site-packages/CTkMessagebox/ctkmessagebox.py),定位到第230行,将height=self.height/2修改为整数除法:

self.info = customtkinter.CTkButton(self.frame_top, width=1, height=int(self.height/2), corner_radius=0, text=self.message, font=self.font,

这样可以确保传递给CTkButton的height参数是整数,彻底解决Tkinter的类型报错。

方案3:隔离matplotlib绘图与Tkinter的上下文

在draw_pre_attack_network函数中使用非交互式的matplotlib后端,避免与Tkinter的后端冲突,防止窗口尺寸被意外修改为浮点数:

def draw_pre_attack_network(self):
    import matplotlib
    # 切换到非交互式后端,不依赖Tkinter
    matplotlib.use('Agg')
    
    G = nx.DiGraph(self.adjacency_matrix)
    pos = nx.spring_layout(G, seed=3113794652)

    plt.figure()

    legend_elements = [
        Line2D([0], [0], marker='o', color='w', label='Network',markerfacecolor='tab:orange', markersize=10),
        Line2D([0], [0], marker='o', color='w', label='Internet',markerfacecolor='maroon', markersize=10)
    ]
    plt.legend(handles=legend_elements, loc='best')

    nx.draw(G, pos, node_color="tab:orange")

    _, internet = self.get_all_compromised_hosts()
    nx.draw(G, pos, nodelist=internet, node_color="maroon")

    labels = {}
    for n in G.nodes:
        add1, add2 = self.hosts[n].get_address()
        labels[n] = str(add1) + ", " + str(add2)

    nx.draw_networkx_labels(G, pos, labels, font_size=6, font_color="whitesmoke")
    plt.savefig(f"./created_network.png", format="PNG")
    plt.close()
    
    # 如果后续需要使用Tkinter后端,再切换回来
    matplotlib.use('TkAgg')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:38:15