python - 矩阵程序,使用python中的绑定(bind)来停止/启动

标签 python loops matrix tkinter

我正在尝试编写一段代码来运行一个简单的矩阵副本,它只是随机生成字符并将它们打印到屏幕上。

编写实际的矩阵部分没有问题,我对我所做的方式感到满意,尽管我欢迎对该部分的任何建议。

但是我所坚持的部分是让它在开始后停止。

基本上在伪代码中,这就是我想要做的

IF PRESS == s:
   matrix()
   check press
   IF PRESS == q:
       END matrix()

我遇到的主要困难是在运行矩阵代码时检查按键。 这是我目前的代码:

import tkinter as tk
from random import randint

global event
event=""

box = tk.Tk()

def matrix():
    line =  chr(randint(0,127)) + "\t" + chr(randint(0,127)) + "\t"
          + chr(randint(0,127)) + "\t" + chr(randint(0,127)) + "\t"
          + chr(randint(0,127)) + "\t" + chr(randint(0,127)) + "\t"
          + chr(randint(0,127)) + "\t" + chr(randint(0,127)) + "\t"
          + chr(randint(0,127)) + "\t" + chr(randint(0,127)) + "\t"
    print (line)
    key(event)

def key(event):
    box.focus_set()
    while event.char == "s":
        print("Matrix starting")
        matrix()
    if event.char == "q":
        #stops matrix
        print("Matrix stopped")

box.bind("<Key>", key)
box.mainloop()

希望有人能够帮助我,我在互联网上查找过,但找不到我要找的东西。

此外,当我尝试更改代码时,GUI 已卡住,我无法执行任何操作。

最佳答案

您可以根据 Tkinter 的优势创建逻辑

添加了重复延迟,正如您在下面的评论中所询问的那样。

添加了状态控制({ nil->[S]tartedSTATE->[Q]uit->nil })来阻止/避免无意义序列

添加了一些 Tkinter 详细信息。

您可能想要限制 chr() 的范围,因为并非原始范围中的所有字符都是“可打印”并且您承担产生不良副作用的风险。

try:
     import Tkinter as tk
     import tkMessageBox
except:
     import tkinter as tk
     import tkinter.messagebox as tkMessageBox

from random import randint

global event                                      # global is possible, designing a Class is better though
event = ""                                        # no need to assign <event>

global box
box = tk.Tk()                                     # Tkinter top-level instance
box.aDelayInMSEC  = 30000                         # .SET an attribute, repeat each 30 sec
box.inStartedSTATE = False                        # .SET an attribute, a stateful control
box.title( "MATRIX Reloaded ... " )               # Tkinter beautifier
box.protocol( 'WM_DELETE_WINDOW', ExitPROCESS )   # [X]-overide ------------------------
box.lift()                                        # GUI make visible

def matrix():
    line =  chr(randint(0,127)) + "\t" + chr(randint(0,127)) + "\t"
          + chr(randint(0,127)) + "\t" + chr(randint(0,127)) + "\t"
          + chr(randint(0,127)) + "\t" + chr(randint(0,127)) + "\t"
          + chr(randint(0,127)) + "\t" + chr(randint(0,127)) + "\t"
          + chr(randint(0,127)) + "\t" + chr(randint(0,127)) + "\t"
    print (line)
    box.after( box.aDelayInMSEC, matrix )         # re-schedule a next round .after()

def StartMATRIX( anEvent ):
    if not box.inStartedSTATE:                    # .IF( not STARTED-already )
        print( "Matrix starting" )                #     .UI
        box.inStartedSTATE = True                 #     .SET state
        matrix()                                  #     .CALL
     pass

def StopMATRIX( anEvent ):
    if box.inStartedSTATE:                        # .IF( was STARTED-before )
        print( "Matrix stopped" )                 #     .UI
        box.inStartedSTATE = False                #     .SET state
        ExitPROCESS()                             #     .CALL
    pass

def ExitPROCESS():                                # MVC-Controller-Part ..
    if tkMessageBox.askokcancel( "Quit GUI", "Do you really wish to quit?" ):
        box.destroy()
    pass

box.bind(       "<KeyPress-s>", StartMATRIX )    # .BIND StartMATRIX()-HANDLER
box.bind( "<Shift-KeyPress-s>", StartMATRIX )    # .BIND StartMATRIX()-HANDLER
box.bind(       "<KeyPress-q>", StopMATRIX )     # .BIND  StopMATRIX()-HANDLER
box.bind( "<Shift-KeyPress-q>", StopMATRIX )     # .BIND  StopMATRIX()-HANDLER

box.mainloop()

关于python - 矩阵程序,使用python中的绑定(bind)来停止/启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26693473/

相关文章:

python-2.7 - Python - Win32Com - Outlook - 将今天发送的项目转发到收件箱

r - 从 R 创建一个由零和一组成的矩阵

python - 函数定义上的正则表达式 findall。想要匹配参数但不匹配函数

python - 如何从 fork 进程发送大量数据?

java - 递归而不是多循环

javascript - 如何让 Javascript 循环等待现有迭代完成后再开始下一次迭代?

javascript - 识别 Canvas 元素,分离矩阵中的元素

python - 有没有更有效的方法来求大量矩阵的平均值?

python - django TemplateDoesNotExist 异常但模板存在

python - 当 Codespeak.net 关闭时安装 lxml