python中winfo_详解python3中tkinter知识点

本文介绍了一个使用Python和Tkinter实现的简单图形界面应用,该应用能够将用户输入的英尺数值转换为对应的米数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#导入tkinter模块,以及导入ttk模块,tkinter是python结合tk的标准接口,ttk是TK8.5之后加入的“主题化工具包”

from tkinter import *

from tkinter import ttk

#定义的计算函数,完成英尺到米的换算

def calculate(*args):

try:

value = float(feet.get())

meters.set((0.3048 * value * 10000.0 + 0.5)/10000.0)

except ValueError:

pass

'''

创建了一个主窗口;

主窗口标题为:“Free to Meters”

通过ttk.Frame创建了一个框架容器;所以界面内容都放在框架中,并把框架放在主窗口root中;

通过grid指定框架的位置,以及对齐方式:sticky说明使用罗盘式方位,控件将要如何在网格单元格里排放(NWES分别表示上左右下);

columnconfigure方法告诉tk自适应宽度;

rowconfigure方法告诉tk自适应高度

'''

root = Tk()

root.title("Feet to Meters")

mainframe = ttk.Frame(root, padding="3 3 12 12")

mainframe.grid(column=0, row=0, sticky=(N, W, E, S))

mainframe.columnconfigure(0, weight=1)

mainframe.rowconfigure(0, weight=1)

feet = StringVar()

meters = StringVar()

feet_entry = ttk.Entry(mainframe, width=7, textvariable=feet)

feet_entry.grid(column=2, row=1, sticky=(W, E))

ttk.Label(mainframe, textvariable=meters).grid(column=2, row=2, sticky=(W, E))

ttk.Button(mainframe, text="Calculate", command=calculate).grid(column=3, row=3, sticky=W)

ttk.Label(mainframe, text="feet").grid(column=3, row=1, sticky=W)

ttk.Label(mainframe, text="is equivalent to").grid(column=1, row=2, sticky=E)

ttk.Label(mainframe, text="meters").grid(column=3, row=2, sticky=W)

'''

检查框架内的所有控件,并在每个控件之间增加一点距离,使他们看起来没那么拥挤;

告诉tk把注意力转移到我们的输入框上;也就是说在开始的时候,光标默认会在输入框,当用户输入的时候不需要去单击

告诉tk用户按下了回车键和单击计算按钮是一样的,会调用计算程序段

'''

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)

feet_entry.focus()

root.bind('', calculate)

#tk让他的事件循环,这样才能让所有的事件运行

root.mainloop()

import tkinter as tk import ttkbootstrap as ttk from ttkbootstrap.constants import * import math import random import time class CornerMarkModule: def __init__(self, parent, width, height, module_id, label_text): self.parent = parent self.width = width self.height = height self.module_id = module_id self.label_text = label_text self.line_ids = [] self.animation_id = None self.data_flow_points = [] self.data_flow_animations = [] # 创建画布 self.canvas = tk.Canvas( parent, width=width, height=height, bg="#121212", highlightthickness=0, bd=0, relief="flat" ) self.canvas.pack(fill=tk.BOTH, expand=True) # 计算中心位置 self.square_size = 80 self.start_x = width // 2 - self.square_size // 2 self.start_y = height // 2 - self.square_size // 2 - 10 # 创建蓝色圆角矩形 self.square = self.create_round_rect( self.start_x, self.start_y, self.start_x + self.square_size, self.start_y + self.square_size, radius=15, fill="#325b74", outline="#5a9bc0", width=2 ) # 添加标签文本 self.label_id = self.canvas.create_text( width // 2, height // 2 - 10, text=label_text, fill="#e0e0e0", font=("Microsoft YaHei", 11, "bold"), width=self.square_size - 10, justify="center" ) # 添加模块编号标签 self.canvas.create_text( width // 2, height - 30, text=f"模块 {module_id}", fill="#7a7a7a", font=("Microsoft YaHei", 9) ) # 添加装饰线条 self.decor_line = self.canvas.create_line( width//2 - 40, height - 25, width//2 + 40, height - 25, fill="#3a6b8c", width=1, dash=(4, 2) ) # 初始参数 self.base_gap = 12 self.base_length = 30 self.create_all_lines() # 动画计数器 self.counter = 0 # 绑定悬停效果 self.canvas.bind("<Enter>", self.on_enter) self.canvas.bind("<Leave>", self.on_leave) def on_enter(self, event): """鼠标悬停效果""" self.canvas.itemconfig(self.square, fill="#5a9bc0") for line_id in self.line_ids: self.canvas.itemconfig(line_id, fill="#5a9bc0") self.canvas.itemconfig(self.decor_line, fill="#5a9bc0") def on_leave(self, event): """鼠标离开效果""" self.canvas.itemconfig(self.square, fill="#325b74") for line_id in self.line_ids: self.canvas.itemconfig(line_id, fill="#3a6b8c") self.canvas.itemconfig(self.decor_line, fill="#3a6b8c") def create_round_rect(self, x1, y1, x2, y2, radius=25, **kwargs): """创建圆角矩形""" points = [ x1 + radius, y1, # 左上角 x2 - radius, y1, x2, y1, x2, y1 + radius, # 右上角 x2, y2 - radius, x2, y2, x2 - radius, y2, # 右下角 x1 + radius, y2, x1, y2, x1, y2 - radius, # 左下角 x1, y1 + radius, x1, y1, x1 + radius, y1 ] return self.canvas.create_polygon(points, **kwargs, smooth=True) def create_all_lines(self): line_color = "#3a6b8c" # 左上角标记 self.line_ids.append(self.canvas.create_line( self.start_x - self.base_gap, self.start_y - self.base_gap, self.start_x - self.base_gap + self.base_length, self.start_y - self.base_gap, width=2, fill=line_color )) self.line_ids.append(self.canvas.create_line( self.start_x - self.base_gap, self.start_y - self.base_gap, self.start_x - self.base_gap, self.start_y - self.base_gap + self.base_length, width=2, fill=line_color )) # 右上角标记 self.line_ids.append(self.canvas.create_line( self.start_x + self.square_size + self.base_gap, self.start_y - self.base_gap, self.start_x + self.square_size + self.base_gap - self.base_length, self.start_y - self.base_gap, width=2, fill=line_color )) self.line_ids.append(self.canvas.create_line( self.start_x + self.square_size + self.base_gap, self.start_y - self.base_gap, self.start_x + self.square_size + self.base_gap, self.start_y - self.base_gap + self.base_length, width=2, fill=line_color )) # 左下角标记 self.line_ids.append(self.canvas.create_line( self.start_x - self.base_gap, self.start_y + self.square_size + self.base_gap, self.start_x - self.base_gap + self.base_length, self.start_y + self.square_size + self.base_gap, width=2, fill=line_color )) self.line_ids.append(self.canvas.create_line( self.start_x - self.base_gap, self.start_y + self.square_size + self.base_gap, self.start_x - self.base_gap, self.start_y + self.square_size + self.base_gap - self.base_length, width=2, fill=line_color )) # 右下角标记 self.line_ids.append(self.canvas.create_line( self.start_x + self.square_size + self.base_gap, self.start_y + self.square_size + self.base_gap, self.start_x + self.square_size + self.base_gap - self.base_length, self.start_y + self.square_size + self.base_gap, width=2, fill=line_color )) self.line_ids.append(self.canvas.create_line( self.start_x + self.square_size + self.base_gap, self.start_y + self.square_size + self.base_gap, self.start_x + self.square_size + self.base_gap, self.start_y + self.square_size + self.base_gap - self.base_length, width=2, fill=line_color )) def update_animation(self): """更新角标动画""" phase = self.counter * 0.08 self.counter += 1 phase_offset = self.module_id * 0.5 distance_factor = 0.5 * math.sin(phase + phase_offset) + 0.5 current_gap = 5 + distance_factor * 20 current_length = 25 + distance_factor * 15 self.update_lines(current_gap, current_length) self.animation_id = self.parent.after(50, self.update_animation) def pause_animation(self): """暂停动画""" if self.animation_id: self.parent.after_cancel(self.animation_id) self.animation_id = None def resume_animation(self): """恢复动画""" if not self.animation_id: self.update_animation() def update_lines(self, gap, length): """更新角标线条位置""" # 左上角 self.canvas.coords(self.line_ids[0], self.start_x - gap, self.start_y - gap, self.start_x - gap + length, self.start_y - gap) self.canvas.coords(self.line_ids[1], self.start_x - gap, self.start_y - gap, self.start_x - gap, self.start_y - gap + length) # 右上角 self.canvas.coords(self.line_ids[2], self.start_x + self.square_size + gap, self.start_y - gap, self.start_x + self.square_size + gap - length, self.start_y - gap) self.canvas.coords(self.line_ids[3], self.start_x + self.square_size + gap, self.start_y - gap, self.start_x + self.square_size + gap, self.start_y - gap + length) # 左下角 self.canvas.coords(self.line_ids[4], self.start_x - gap, self.start_y + self.square_size + gap, self.start_x - gap + length, self.start_y + self.square_size + gap) self.canvas.coords(self.line_ids[5], self.start_x - gap, self.start_y + self.square_size + gap, self.start_x - gap, self.start_y + self.square_size + gap - length) # 右下角 self.canvas.coords(self.line_ids[6], self.start_x + self.square_size + gap, self.start_y + self.square_size + gap, self.start_x + self.square_size + gap - length, self.start_y + self.square_size + gap) self.canvas.coords(self.line_ids[7], self.start_x + self.square_size + gap, self.start_y + self.square_size + gap, self.start_x + self.square_size + gap, self.start_y + self.square_size + gap - length) def get_center(self): """获取模块中心位置""" return (self.width // 2, self.height // 2 - 10) class DataFlowVisualizer: def __init__(self, parent, modules): self.parent = parent self.modules = modules self.connections = [] self.flow_lines = [] self.flow_points = [] self.animations = [] # 创建画布用于绘制连接线 self.canvas = tk.Canvas( parent, bg="#121212", highlightthickness=0, bd=0 ) self.canvas.place(relx=0, rely=0, relwidth=1, relheight=1) self.canvas.lower() # 定义模块连接关系 self.define_connections() def define_connections(self): """定义模块之间的连接关系""" # 干扰(1) -> 威胁分析(2) self.add_connection(1, 2, "#ff6b6b") # 威胁分析(2) -> 知识库(4) self.add_connection(2, 4, "#4ecdc4") # 威胁分析(2) -> 推理引擎(5) self.add_connection(2, 5, "#ffd166") # 推理引擎(5) -> 决策输出(6) self.add_connection(5, 6, "#1a936f") # 决策输出(6) -> 知识库(4) self.add_connection(6, 4, "#9b5de5") # 抗干扰中(3) -> 干扰(1) self.add_connection(3, 1, "#5a9bc0") def add_connection(self, from_id, to_id, color): """添加连接关系""" self.connections.append({ &#39;from&#39;: from_id, &#39;to&#39;: to_id, &#39;color&#39;: color }) def draw_connections(self): """绘制所有连接线""" for conn in self.connections: from_module = self.get_module_by_id(conn[&#39;from&#39;]) to_module = self.get_module_by_id(conn[&#39;to&#39;]) if from_module and to_module: # 获取模块在父容器中的位置 from_x = from_module.winfo_x() + from_module.get_center()[0] from_y = from_module.winfo_y() + from_module.get_center()[1] to_x = to_module.winfo_x() + to_module.get_center()[0] to_y = to_module.winfo_y() + to_module.get_center()[1] # 绘制连接线 line_id = self.canvas.create_line( from_x, from_y, to_x, to_y, fill=conn[&#39;color&#39;], width=2, dash=(6, 4), arrow=tk.LAST, arrowshape=(12, 15, 5) ) self.flow_lines.append(line_id) # 创建流动数据点 self.create_flow_point(from_x, from_y, to_x, to_y, conn[&#39;color&#39;]) def get_module_by_id(self, module_id): """根据ID获取模块实例""" for module in self.modules: if module.module_id == module_id: return module return None def create_flow_point(self, from_x, from_y, to_x, to_y, color): """创建流动的数据点""" points = self.generate_path_points(from_x, from_y, to_x, to_y) point = self.canvas.create_oval(0, 0, 0, 0, fill=color, outline="") self.flow_points.append(point) self.animate_point(point, points) def generate_path_points(self, from_x, from_y, to_x, to_y, num_points=30): """生成路径点""" points = [] for i in range(num_points): t = i / (num_points - 1) x = from_x + (to_x - from_x) * t y = from_y + (to_y - from_y) * t points.append((x, y)) return points def animate_point(self, point, points, index=0): """动画点沿路径移动""" if index >= len(points): index = 0 x, y = points[index] r = 5 self.canvas.coords(point, x-r, y-r, x+r, y+r) speed = random.randint(1, 3) anim_id = self.parent.after(50, lambda: self.animate_point(point, points, index + speed)) self.animations.append(anim_id) def stop_animations(self): """停止所有动画""" for anim_id in self.animations: self.parent.after_cancel(anim_id) self.animations = [] class SystemStatusBar(ttk.Frame): """系统状态栏组件""" def __init__(self, parent): super().__init__(parent, padding=(10, 5)) self.pack(fill=tk.X, pady=(15, 5)) # 系统状态 self.status_label = ttk.Label( self, text="系统状态: 运行中", font=("Microsoft YaHei", 10), bootstyle="success" ) self.status_label.pack(side=tk.LEFT, padx=10) # 数据流状态 self.flow_label = ttk.Label( self, text="数据流: 正常", font=("Microsoft YaHei", 10), bootstyle="info" ) self.flow_label.pack(side=tk.LEFT, padx=10) # 威胁级别 self.threat_label = ttk.Label( self, text="威胁级别: 低", font=("Microsoft YaHei", 10), bootstyle="warning" ) self.threat_label.pack(side=tk.LEFT, padx=10) # 更新时间 self.time_label = ttk.Label( self, text="", font=("Microsoft YaHei", 10), bootstyle="secondary" ) self.time_label.pack(side=tk.RIGHT, padx=10) self.update_time() def update_time(self): """更新时间显示""" current_time = time.strftime("%Y-%m-%d %H:%M:%S") self.time_label.config(text=f"更新时间: {current_time}") self.after(1000, self.update_time) def create_dynamic_flow_visualization(): """创建动态数据流可视化系统""" # 创建主窗口 root = ttk.Window(title="动态数据流可视化系统", themename="superhero") root.configure(bg="#121212") # 设置窗口大小并居中 window_width = 1400 window_height = 800 screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() center_x = int(screen_width/2 - window_width/2) center_y = int(screen_height/2 - window_height/2) root.geometry(f"{window_width}x{window_height}+{center_x}+{center_y}") # 创建主容器框架 main_container = ttk.Frame(root, padding=(30, 20, 30, 10)) main_container.pack(fill=tk.BOTH, expand=True) # 创建标题栏 header_frame = ttk.Frame(main_container) header_frame.pack(fill=tk.X, pady=(0, 20)) title_label = ttk.Label( header_frame, text="动态数据流可视化系统", font=("Microsoft YaHei", 18, "bold"), bootstyle="inverse-primary" ) title_label.pack(side=tk.LEFT) subtitle = ttk.Label( header_frame, text="实时监控与响应系统", font=("Microsoft YaHei", 12), bootstyle="secondary" ) subtitle.pack(side=tk.LEFT, padx=(15, 0), pady=(5, 0)) # 添加控制按钮 control_frame = ttk.Frame(header_frame) control_frame.pack(side=tk.RIGHT) # 创建网格容器 grid_container = ttk.Frame(main_container) grid_container.pack(fill=tk.BOTH, expand=True) # 配置网格布局 grid_container.grid_rowconfigure(0, weight=1) grid_container.grid_rowconfigure(1, weight=1) grid_container.grid_rowconfigure(2, weight=1) grid_container.grid_columnconfigure(0, weight=1) grid_container.grid_columnconfigure(1, weight=1) grid_container.grid_columnconfigure(2, weight=1) grid_container.grid_columnconfigure(3, weight=1) # 定义模块标签文本 labels = ["干扰", "威胁分析", "抗干扰中", "知识库", "推理引擎", "决策输出"] # 创建模块容器 modules = [] # 抗干扰中 - 第1行第2列 cell0 = ttk.Frame(grid_container) cell0.grid(row=0, column=1, padx=15, pady=15, sticky="nsew") module0 = CornerMarkModule(cell0, 220, 280, 3, labels[2]) modules.append(module0) # 知识库 - 第3行第2列 cell1 = ttk.Frame(grid_container) cell1.grid(row=2, column=1, padx=15, pady=15, sticky="nsew") module1 = CornerMarkModule(cell1, 220, 280, 4, labels[3]) modules.append(module1) # 干扰 - 第2行第1列 cell2 = ttk.Frame(grid_container) cell2.grid(row=1, column=0, padx=15, pady=15, sticky="nsew") module2 = CornerMarkModule(cell2, 220, 280, 1, labels[0]) modules.append(module2) # 威胁分析 - 第2行第2列 cell3 = ttk.Frame(grid_container) cell3.grid(row=1, column=1, padx=15, pady=15, sticky="nsew") module3 = CornerMarkModule(cell3, 220, 280, 2, labels[1]) modules.append(module3) # 推理引擎 - 第2行第3列 cell4 = ttk.Frame(grid_container) cell4.grid(row=1, column=2, padx=15, pady=15, sticky="nsew") module4 = CornerMarkModule(cell4, 220, 280, 5, labels[4]) modules.append(module4) # 决策输出 - 第2行第4列 cell5 = ttk.Frame(grid_container) cell5.grid(row=1, column=3, padx=15, pady=15, sticky="nsew") module5 = CornerMarkModule(cell5, 220, 280, 6, labels[5]) modules.append(module5) # 启动所有模块的动画 for module in modules: module.update_animation() # 更新UI以确保位置信息正确 root.update() # 创建数据流可视化 flow_visualizer = DataFlowVisualizer(grid_container, modules) flow_visualizer.draw_connections() # 添加系统状态栏 status_bar = SystemStatusBar(main_container) # 添加控制按钮 exit_button = ttk.Button( control_frame, text="安全退出", command=lambda: safe_exit(root, modules, flow_visualizer), bootstyle="danger-outline", width=12 ) exit_button.pack(side=tk.RIGHT, padx=5) pause_button = ttk.Button( control_frame, text="暂停动画", command=lambda: toggle_animation(modules, pause_button), bootstyle="warning-outline", width=12 ) pause_button.pack(side=tk.RIGHT, padx=5) # 添加性能优化按钮 optimize_button = ttk.Button( control_frame, text="性能优化", command=lambda: optimize_performance(modules, flow_visualizer), bootstyle="info-outline", width=12 ) optimize_button.pack(side=tk.RIGHT, padx=5) root.mainloop() def safe_exit(root, modules, flow_visualizer): """安全退出程序""" for module in modules: module.pause_animation() flow_visualizer.stop_animations() root.after(500, root.destroy) def toggle_animation(modules, button): """切换动画状态""" if button.cget("text") == "暂停动画": for module in modules: module.pause_animation() button.configure(text="继续动画") else: for module in modules: module.resume_animation() button.configure(text="暂停动画") def optimize_performance(modules, flow_visualizer): """优化系统性能""" # 简化动画效果 for module in modules: module.pause_animation() module.resume_animation() # 减少数据流动画数量 flow_visualizer.stop_animations() for conn in flow_visualizer.connections: from_module = flow_visualizer.get_module_by_id(conn[&#39;from&#39;]) to_module = flow_visualizer.get_module_by_id(conn[&#39;to&#39;]) if from_module and to_module: from_x = from_module.winfo_x() + from_module.get_center()[0] from_y = from_module.winfo_y() + from_module.get_center()[1] to_x = to_module.winfo_x() + to_module.get_center()[0] to_y = to_module.winfo_y() + to_module.get_center()[1] flow_visualizer.create_flow_point(from_x, from_y, to_x, to_y, conn[&#39;color&#39;]) if __name__ == "__main__": create_dynamic_flow_visualization() 生成的代码运行时闪退并且出现了这些报错,帮我修改代码中的错误并写出完整代码Traceback (most recent call last): File "/home/ljc/Python/test/direction.py", line 561, in <module> create_dynamic_flow_visualization() File "/home/ljc/Python/test/direction.py", line 486, in create_dynamic_flow_visualization flow_visualizer = DataFlowVisualizer(grid_container, modules) File "/home/ljc/Python/test/direction.py", line 228, in __init__ self.canvas.lower() File "/usr/lib/python3.8/tkinter/__init__.py", line 2914, in tag_lower self.tk.call((self._w, &#39;lower&#39;) + args) _tkinter.TclError: wrong # args: should be ".!frame.!frame2.!canvas lower tagOrId ?belowThis?"
最新发布
07-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值