如何用Tkinter的Checkbutton控制滑块驱动的Canvas线条显示与隐藏?
实现思路
用tk.BooleanVar绑定Checkbutton,通过变量状态决定是否绘制Canvas上的信号,同时让滑块调整操作也遵循这个状态逻辑。
修改后的完整代码
import tkinter as tk from tkinter import ttk import numpy as np from scipy import signal as sg root = tk.Tk() root.title('Oscilloscope') root.geometry("1000x600+0+0") N1 = 2000 X1 = 1000 O1 = 200 # 存储信号显示状态的变量,默认开启显示 show_signal = tk.BooleanVar(value=True) # 画布 cnv = tk.Canvas(root, width = 800, height = 400, bg = 'white') cnv.place(relx=0.5, rely=0.3, anchor=tk.CENTER) cnv.create_line(400, 0, 400, 400, fill='black', width=1) cnv.create_line(0, 200, 1000, 200, fill='black', width=1) # 滑块标签 amplitude = ttk.Label(root, text="Amplitude", font=("Arial", 12, "bold"), foreground="black") amplitude.place(relx=0.3, rely=0.7, anchor=tk.CENTER) frequence = ttk.Label(root, text="Frequency", font=("Arial", 12, "bold"), foreground="black") frequence.place(relx=0.7, rely=0.7, anchor=tk.CENTER) # 信号显示开关 signal_switch = ttk.Label(root, text="Show Triangle Wave", font=("Arial", 12, "bold"), foreground="black") signal_switch.place(relx=0.5, rely=0.6, anchor=tk.CENTER) show_btn = ttk.Checkbutton(root, variable=show_signal, command=lambda: ctrl_curseurs_1()) show_btn.place(relx=0.5, rely=0.65, anchor=tk.CENTER) # 绘制三角波函数 def draw1(cnv, A1, F1, O1, N1): cnv.delete("line1") xpts1 = X1 / (N1-1) line1 = [] for i in range(N1): x = (i * xpts1) y = A1*sg.sawtooth(2*np.pi*F1*i/N1, width=0.5) + O1 line1.extend((x, y)) cnv.create_line(line1, fill="red2", width=3, tag="line1") # 滑块控制逻辑(包含显示状态判断) def ctrl_curseurs_1(*args): if show_signal.get(): A1 = A1_valeur.get() F1 = F1_valeur.get() draw1(cnv, A1, F1, O1, N1) else: cnv.delete("line1") # 振幅滑块 A1_valeur = tk.IntVar() A1_frm = ttk.Frame(root) A1_frm.place(relx=0.3, rely=0.8, anchor=tk.CENTER) A1_scale = tk.Scale(A1_frm, variable=A1_valeur, command=ctrl_curseurs_1, from_ = -200, to = 200, length=200, showvalue=1, tickinterval=100, orient = tk.HORIZONTAL, resolution=1) A1_scale.pack(anchor=tk.CENTER) # 频率滑块 F1_valeur = tk.IntVar() F1_frm = ttk.Frame(root) F1_frm.place(relx=0.7, rely=0.8, anchor=tk.CENTER) F1_scale = tk.Scale(F1_frm, variable=F1_valeur, command=ctrl_curseurs_1, from_ = 0, to = 50, length=200, showvalue=1, tickinterval=10, orient = tk.HORIZONTAL, resolution=1) F1_scale.pack(anchor=tk.CENTER) # 启动时默认绘制信号 ctrl_curseurs_1() root.mainloop()
关键修改说明
- 新增
show_signal布尔变量,控制信号的显示/隐藏状态 - 添加Checkbutton控件,点击时触发控制函数更新信号状态
- 调整
ctrl_curseurs_1函数:勾选状态下正常绘制信号,取消勾选则删除画布上标记为line1的信号 - 程序启动时调用
ctrl_curseurs_1(),确保初始状态显示信号
内容的提问来源于stack exchange,提问作者denis
相关产品推荐
相关产品推荐

