当前位置: 首页 > 知识库问答 >
问题:

Guizero/TKinter中的计时器

冯宏浚
2023-03-14

现在我正忙着为我的项目制作图形用户界面。它也需要一个由时间驱动的测试。然而当我按下开始按钮时,计数器开始计数,但是图形用户界面冻结了,所以你不能按下停止按钮。最终程序停止并关闭了它的自我。

看看我的代码

###import libaries ###
from guizero import *
import tkinter as tk
import time

timeLoop = False
###Variabelen###

Sec = 0
Min = 0
Hour = 0
test_stat = 0


###Define Loops###
def verlaat_settings():
   window2.hide()
   window3.hide()
   window4.hide()
   window.show(wait=True)

def stop_test():
   info("test_result","Test stopped at" + str(Hour) + " Hour " + str(Min) + " Mins " + str(Sec) + " Sec ")
   text_test.value = "Test Stopped..."
   timeLoop: False



def test_loopt():
   global Sec
   global Min
   text_test.value = "Test is running....."
   timeLoop = True
   while timeLoop:
      Sec +=1
      print(str(Min) + " Mins " + str(Sec) + " Sec ")
      time.sleep(1)
      if Sec == 60:
         Sec = 0
         Min += 1
app= App(title="Profiberry",layout="",width=480, height=272)
window3 = Window(app,title="Profiberry-Tester", layout="grid",width=480, height=272)
window3.show

###Window3###
welkom_tester= Text(window3, text="Profibus Tester",grid=[2,0,1,1])
Plaatje_profi= Picture(window3,image="logoprofi.gif",grid=[2,1,1,1])
lege_ruimte1 = Text(window3, text="", grid=[2,2,1,1])
text_test= Text(window3,text="  Waiting for input..... ",grid=[2,3,1,1])
timer_test= Text(window3,text=(""),grid=[2,4,1,1] )
lege_ruimte2 = Text(window3, text="", grid=[2,5,1,1])
lege_ruimte2 = Text(window3, text="", grid=[1,6])
Start_knop= PushButton(window3,text="Start",command=test_loopt,padx=50, pady=10, grid=[1,6] )
Start_knop.tk.config(foreground="white",background="green")
Stop_knop= PushButton(window3,text="Stop",command=stop_test,padx=50,pady=10,grid=[3,6])
Stop_knop.tk.config(foreground="white",background="red")
Exit_setting = PushButton(window3,command=verlaat_settings,text="Exit to Main Menu(F2)",padx=30,pady=10,grid=[2,6])

我将通过我节目的这一部分向大家介绍:

  • 导入用于此目的的库
  • 给我们的while变量timeLoop一个错误的状态
  • 给我们的变量赋值
  • 下面是我们的Def循环verlaat_设置用于通过GUI中的窗口移动Stop_测试用于在按下Stop时执行操作(也用于重置while状态)test_loopt是实际的测试,计数器必须在此运行它在shell中的操作
  • 下面我们打开窗口并放置小部件

共有3个答案

龚征
2023-03-14

在GuiZero的文档中有一个基本答案。问题是,因为这个循环,GuiZero的显示循环被阻塞了,就像你所说的那样,使其暂停,最终使其崩溃。这是因为GuiZero是一个事件驱动的循环,这就是为什么它使用。display()循环检查事件。

你需要使用。重复方法(如下所示),让应用程序重复该操作。

.repeat( [enter delay here in milliseconds] , [command to execute] )

这意味着不需要函数中的循环。

我知道我回答这个问题有点晚了,但我希望这能有所帮助。

华宣
2023-03-14

所以在搜索了一段时间后,我在这里发现了一个页面,其中有一个python 2.7上的人有完全相同的问题。

解决方案是,一切都在主循环中运行,主循环永远在这个test_loopt上等待,解决方案是制作一个线程,在我的例子中是:

def test_loopt():
   global Sec
   global Min
   text_test.value = "Test is running....."
   timeLoop = True
   while timeLoop:
      Sec +=1
      print(str(Min) + " Mins " + str(Sec) + " Sec ")
      time.sleep(1)
      if Sec == 60:
         Sec = 0
         Min += 1
      if Min == 60:
         Sec = 0
         Min = 0
         Hour = 1
   if stop_test():
      timeLoop = False

def start_test_loopt_thread():
   global test_loopt_thread
   test_loopt_thread = threading.Thread(target=test_loopt)
   test_loopt_thread.deamon = True
   test_loopt_thread.start()
饶元章
2023-03-14

这个答案是为了帮助用户避免遇到类似情况。虽然提出的答案富有想象力,但有点冗长。在GuiZero。函数的作用是创建一个无限循环。因此,任何使用普通python时间函数的行为都会阻止display循环的执行。使用GuiZero时,不要使用sleep或while循环。它更简单,更容易使用。重复(持续时间,命令)例如,如果这一行:

Start_knop= PushButton(window3,text="Start",command=test_loopt,padx=50, pady=10, grid=[1,6] )

变成了那些:

Start_knop= PushButton(window3,text="Start",padx=50, pady=10, grid=[1,6])
Start_knop.repeat(1000, test_loopt)

以及原始的test_loopt函数:

def test_loopt():
   global Sec
   global Min
   text_test.value = "Test is running....."
   timeLoop = True
   while timeLoop:
      Sec +=1
      print(str(Min) + " Mins " + str(Sec) + " Sec ")
      time.sleep(1)
      if Sec == 60:
         Sec = 0
         Min += 1
      if Min == 60:
         Sec = 0
         Min = 0
         Hour = 1
      if stop_test():
         timeLoop = False

修改为:

def test_loopt():
   global Secs, Mins, Hrs
   text_test.value = "Test is running....."
   Secs +=1
   print(str(Hrs) + " Hours " + str(Min) + " Mins " + str(Sec) + " Sec ")
   if Secs%60 == 0:
      Secs = 0
      Mins += 1
   if Min%60 == 0:
      Secs, Mins = 0, 0
      Hrs += 1
  

必须注意的是,结果不会显示在GUI上,而是显示在IDE中,并且循环没有结束。还需要从以下位置修改stop_测试功能:

def stop_test():
   info("test_result","Test stopped at" + str(Hour) + " Hour " + str(Min) + " Mins " + str(Sec) + " Sec ")
   text_test.value = "Test Stopped..."
   timeLoop: False

def stop_test():
   info("test_result","Test stopped at" + str(Hrs) + " Hour " + str(Mins) + " Mins " + str(Secs) + " Sec ")
   text_test.value = "Test Stopped..."
   Start_knop.after(pause_loop)

def pause_loop():
   pass

或者类似的东西

 类似资料:
  • 我想为我的简单数学游戏添加一个计时器。到目前为止,一切都很好,用户在按下按钮时会收到问题,并得到答案的反馈。我想给用户添加一个定时器,让用户看看回答乘法需要多少时间。这是我这个数学游戏原型的最后一部分。我希望定时器在用户点击“NYTT TAL”(瑞典语中的新数字)时启动,在用户点击“SVAR”(瑞典语中的应答)时停止。这是我的密码。

  • 我的目标是创建一个简单的计时器程序。它不断更新自己,直到按下停止按钮。然而,我不确定如何停止刻度函数运行,以便定时器在按下停止按钮后保持不变。 这是我目前的代码: 停止函数的可能方法是什么? 任何帮助都将不胜感激!

  • 问题内容: 我需要使用Python的tkinter库编写程序。 我的主要问题是我不知道如何创建计时器或类似 的时钟hh:。 我需要它来更新自身(这是我不知道该怎么做的)。 问题答案: 根窗口具有一种称为的方法,该方法可用于安排给定时间段后要调用的函数。如果该函数本身调用,则您已设置了一个自动重复事件。 这是一个工作示例: 请记住,这不能保证该功能将完全按时运行。它仅计划在给定的时间后运行作业。由于

  • 问题内容: 我想在PyDev(Eclipse)python 2.75中创建一个图形窗口。 我做了几件事,但我想做一个“入口”“眨眼”。测试用户输入。如果是整数,则应闪烁绿色一秒钟,然后变为白色。但是,如果是其他字符串,则应闪烁红色,然后变成白色。我使用了a,但无法正常使用。 这是我执行此操作的代码: 问题答案: 阻止程序执行。 使用。 例如:

  • 问题内容: 我想使用倒数计时器功能在Tkinter中设置标签。现在,一旦达到10,我所做的全部工作就是将标签设置为“ 10”,我真的不明白为什么。另外,即使我将计时器打印到终端上,“时间到了!” 一点都不打印。 问题答案: Tkinter已经有一个无限循环运行(事件循环),并且有一种方法可以安排在一段时间后运行事物(使用)。您可以通过编写每秒调用一次以更新显示的函数来利用此功能。您可以使用类变量来

  • 问题内容: 尝试使用来自virtualenv的基于TKinter的小部件运行python代码。 将TK安装到virtualenv的正确方法是什么? 问题答案: 在脚本中设置环境变量TCL_LIBRARY 。在Windows(带有Tcl 8.5的Python 2.7)上,只需将此行添加到: @Jasper van den Bosch的编辑:在Ubuntu上,对脚本的修改如下: 可以在askubunt