Python 如何将空格键绑定到Tkinter上的2个函数?

Python 如何将空格键绑定到Tkinter上的2个函数?,python,tkinter,Python,Tkinter,所以我尝试制作一个计时器(比如cstimer.net),我遇到了这个问题 我已经绑定了空格键来启动计时器,然后,一旦你启动计时器,再次点击它就会停止它。问题是,当我按下空格键时,它会启动并完成计时器。时间不会重置,它只会将经过的时间添加到最后一次 以下是我所做的: 导入pyglet 导入操作系统 导入时间 从tkinter进口* #导入脚本 导入系统 sys.path.insert(1'。/脚本') 输入加扰器 导入计时器 导入保存程序 类应用程序(): 定义初始化(自我,应用程序): self

所以我尝试制作一个计时器(比如cstimer.net),我遇到了这个问题

我已经绑定了空格键来启动计时器,然后,一旦你启动计时器,再次点击它就会停止它。问题是,当我按下空格键时,它会启动并完成计时器。时间不会重置,它只会将经过的时间添加到最后一次

以下是我所做的:

导入pyglet 导入操作系统 导入时间 从tkinter进口* #导入脚本 导入系统 sys.path.insert(1'。/脚本') 输入加扰器 导入计时器 导入保存程序 类应用程序(): 定义初始化(自我,应用程序): self.app=app pyglet.font.add_文件('./data/font/DS-DIGIB.TTF')#添加时间字体 #添加正文(用于加扰和更多元素)字体 pyglet.font.add_文件('./data/font/OverPassMono-Light.ttf') #创建侧面板 self.sidepanel=Frame(self.app,bg='red',宽度=200,高度=800) #产生加扰 self.scramble\u输出=扰码器.gen\u 333扰码() #将空格键绑定到启动计时器 self.app.bind(“”,self.updater\u start) #定义按钮、开始时间和加扰小部件并显示它们 self.display=Label(self.app,text='0.00',bg='232931',fg='white',anchor=CENTER,font=('DS-DIGITAL',64),pady=100) self.scramble=Label(self.app,text=self.scramble_输出,bg='232931',fg='white',font=('Overpass Mono Light',12',anchor=NW) self.start_按钮=按钮(self.app,text='start',fg='white',bg='4ecca3',command=self.start,anchor=CENTER) #网格显示 self.display.grid(行=1,列=1,粘性=EW,padx=275,pady=150) self.start_按钮.grid(行=2,列=1,列span=2,padx=275,粘性=N,ipadx=20) self.scramble.grid(行=0,列=1,粘性=EW,padx=275) def启动(自): #取消显示上次或开始时间 self.display.grid_remove() #开始计时 self.start\u time=timer.start() #绑定空格键以停止计时器 self.app.bind(“”,self.updater_-stop) #创建小部件以显示计时器正在运行,并单击“完成”按钮 self.state=Label(self.app,text='.',bg='#232931',fg='white',font=('DS-DIGITAL',32)) self.state.grid(行=1,列=1,粘性=EW,padx=560,pady=300) self.finish_按钮=按钮(self.app,text='finish',fg='white',bg='4ecca3',command=self.finish) self.finish_按钮网格(行=2,列=1,列span=2,padx=275,粘性=N,ipadx=20) #取消显示开始按钮和加扰窗口小部件 self.start\u按钮.grid\u remove() self.scramble.grid_remove() def更新程序_启动(self,e): 如果e.keysym=='space': 打印('Hitted spacebar') self.start() def更新程序_停止(self,e): 如果e.keysym=='space': 打印('Hitted spacebar') self.finish() def完成(自): self.message=timer.finish(self.start\u时间) #显示格式化时间 self.display=Label(self.app,text=self.message,bg='#232931',fg='white',font=('DS-DIGITAL',64),pady=100) #在times.json上节省时间 节省时间(self.message、self.scramble\u输出) #取消显示状态和完成按钮小部件 self.finish_按钮.grid_remove() self.state.grid_remove() #重新定义小部件 self.start_按钮=按钮(self.app,text='start',fg='white',bg='#4ecca3',command=self.start) self.scramble\u输出=扰码器.gen\u 333扰码() self.scramble=Label(self.app,text=self.scramble_输出,bg='232931',fg='white',font=('Overpass Mono Light',12',anchor=NW) #在屏幕上显示窗口小部件并格式化时间 self.display.grid(行=1,列=1,粘性=EW,padx=275,pady=150) self.start_按钮.grid(行=2,列=1,列span=2,padx=275,粘性=N,ipadx=20) self.scramble.grid(行=0,列=1,粘性=EW,padx=275)
正如您所知,savertimerscramber模块是我制作的脚本,因此我可以分割代码。计时器脚本只需在开始时获取time.time()变量,并将其与当前时间相减,然后将其格式设置为小时:秒:分钟。

我建议为空格键按下的次数设置一个变量。绑定空格键时,请检查空格键是否为偶数(0、2、4等)。这意味着它应该启动。否则,它应该结束

from tkinter import *

root = Tk()
NUM_SPACE_PRESS = 0


def space_press(e):
    global NUM_SPACE_PRESS
    if NUM_SPACE_PRESS % 2 == 0:
        Label(text='<start here>').pack()
        NUM_SPACE_PRESS += 1
    else:
        Label(text='<end here>').pack()
        NUM_SPACE_PRESS += 1


root.bind("<space>", space_press)

root.mainloop()
从tkinter导入*
root=Tk()
NUM\u SPACE\u PRESS=0
def空间_压力(e):
全局数字空间按
如果NUM_SPACE_按%2==0:
标签(文本=“”).pack()
NUM_SPACE_PRESS+=1
其他:
标签(文本=“”).pack()
NUM_SPACE_PRESS+=1
root.bind(“”,空格键)
root.mainloop()

您应该使用一个带有变量的函数,即
运行
真/假
来通知要执行的操作-停止或启动计时器

import tkinter as tk

def space_press(event):
    global running
        
    if running:
        l['text'] = 'timer stoped'
    else:
        l['text'] = 'timer started'

    # switch state
    running = not running

# --- main ---

running = False

root = tk.Tk()

l = tk.Label(root, text='press space')
l.pack()

root.bind("<space>", space_press)

root.mainloop()
将tkinter作为tk导入
def空间压力(事件):
全球运行
如果正在运行:
l['text']='timer stopped'
其他:
l['text']=“计时器已启动”
#开关状态
运行=不运行
#---梅因---
运行=错误
root=tk.tk()
l=tk.Label(根,text='press space')
l、 包()
root.bind(“”,空格键)
root.mainloop()

您需要在
finish()
函数中重置
绑定

以下是基于您的修改示例:

class应用程序():
定义初始化(自我,应用程序):
...
self.bind(self.start)#替换self.app.bind(“,self.updater_start))
...
#附加功能
def绑定(自,回调=无):
self.app.bind(“,回调)
def启动(自身,事件=无):
self.bind()#忙时禁用空间绑定
...
#已删除self.app.bind(“,self.updater\u stop)
...
自动绑定(自动完成)
def fini
# import pyglet
# import os
import time
from datetime import timedelta
from tkinter import *


# Import scripts
# import sys
# sys.path.insert(1, './scripts')

# import scrambler
# import timer
# import saver

class Application():
    def __init__(self, app):
        self.app = app

        # pyglet.font.add_file('./data/fonts/DS-DIGIB.TTF')  # Add the time font
        # Add the body (used for scramble and more elements) font
        # pyglet.font.add_file('./data/fonts/OverPassMono-Light.ttf')

        # Create side panel
        self.sidepanel = Frame(self.app, bg='red', width=200, height=800)

        # Generate scramble
        self.scramble_output = 'scramble_output goes here' # scrambler.gen_333scramble()

        #Bind spacebar to start timer
        self.app.bind('<space>', self.toggle_timer_running)

        # Define button, start time and scramble Widget and show them
        self.display = Label(self.app, text='0.00', bg='#232931', fg='white', anchor=CENTER, font=('DS-DIGITAL', 64), pady=100)
        self.scramble = Label(self.app, text=self.scramble_output, bg='#232931', fg='white', font=('Overpass Mono Light', 12), anchor=NW)
        self.start_button = Button(self.app, text='Start', fg='white', bg='#4ecca3', command=self.toggle_timer_running, anchor=CENTER)
            
        #Show in grid
        self.display.grid(row=1, column=1, sticky=EW, padx=275, pady=150)
        self.start_button.grid(row=2, column=1, columnspan=2, padx=275, sticky=N, ipadx=20)
        self.scramble.grid(row=0, column=1, sticky=EW, padx=275)

        self._timer_running = False
        self.start_time = self.end_time = time.time()
        self.update()

    def toggle_timer_running(self, event=None):
        self._timer_running = not self._timer_running
        
        if self._timer_running:
            self.start_time = time.time()
            self.start_button.config(text='Finish')
        else:
            self.start_button.config(text='Start')

    def update(self):
        if self._timer_running:
            self.end_time = time.time()
        duration = self.end_time - self.start_time
        self.display.configure(text=timedelta(seconds= duration))
        self.app.after(100, self.update)


if __name__ == '__main__':
    app = Tk()
    Application(app)
    app.mainloop()