我正在尝试编写一段代码来运行一个简单的矩阵副本,它只是随机生成字符并将它们打印到屏幕上。
编写实际的矩阵部分没有问题,我对我所做的方式感到满意,尽管我欢迎对该部分的任何建议。
但是我所坚持的部分是让它在开始后停止。
基本上在伪代码中,这就是我想要做的
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/