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
相关产品推荐
相关产品推荐

