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

如何用Tkinter的Checkbutton控制滑块驱动的Canvas线条显示与隐藏?

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 06:04:59