python - 为turtle构建内置文本字段,while语句不起作用
问题描述
我已经构建了一个文本字段模块,它有一个问题:为什么 Python IDLE 不适用于 while...break 语句?
最初我没有 break 语句,这不起作用,所以我添加了 break 语句,同样的问题仍然存在。
这是一个很长的脚本。您将需要其中的一切。不要在 repl.it 中运行,因为它不会运行。但是它确实在 IDLE 上运行。
https://repl.it/@SUPERMECHM500/TextField
如脚本中所述,第 610 行的 while 语句不会在 IDLE 上加载,并且break
无法按预期工作:如果 TextField.FullOutput 对象有文本,则继续执行代码。
我的问题都与 repl.it 无关,所以不要在你的答案中提及它。将此脚本作为文本文件从 python IDLE 运行和调试。
解决方案
首先,几个小问题:
def listenforkeys(bool):
bool
是 Python 关键字,请选择不同的变量名称。(例如flag
。)这or
不像你想的那样工作:
if TextField.FullOutput and TextField.inp != "" or []:
重读关于or
. 不要使用与此语句相同的海龟来TextField
实现使用:TextField
t.clear()
t
清除用户执行的所有操作TextField
。使用不同的乌龟。最后,你的电话mainloop()
是在错误的地方。一旦你调用它,你的代码就会停止并且 tkinker 事件处理程序接管。它通常应该是您的代码设计的最后一件事。
现在主要问题,这个使用代码:
while TextField.FullOutput == "": #Hope this works with Windows IDLE...
tm.sleep(0.1)
print("Waiting for input...")
if TextField.FullOutput != "":
print('Data sent to RAM.')
break
不要循环等待缓冲区填充。这确实应该是一个事件,但至少是一个回调。我在下面重写了您的代码以使其成为回调,请参阅Enter()
函数和示例使用代码。它现在在 IDLE 和命令提示符下对我有用。我还做了很多其他的小改动来尝试清理一下——其中一些可能需要进一步测试......
# Text field that can be used universally.
# Created by SUPERMECHM500 @ repl.it
# Full functionallity can only be achieved by using IDLE on Windows.
from turtle import Screen, Turtle, mainloop
class TextField:
TextFieldBorderColor = '#0019fc'
TextFieldBGColor = '#000000'
TextFieldTextColor = '#ffffff'
ShiftedDigits = {'1':'!', '2':'@', '3':'#', '4':'$', '5':'%', '6':'^', '7':'&', '8':'*', '9':'(', '0':')'}
def __init__(self, callBack=None):
self.callBack = callBack
self.turtle = Turtle(visible=False)
self.turtle.speed('fastest')
self.inp = []
self.FullOutput = ""
self.TextSeparation = 7
self.s = self.TextSeparation
self.key_shiftL = False
def DrawTextField(self, Title):
t = self.turtle
t.pensize(1)
t.color(TextField.TextFieldBorderColor)
t.pu()
t.goto(-200, -190)
t.write(Title)
t.goto(-200, -200)
t.pd()
t.goto(200, -200)
t.goto(200, -250)
t.goto(-200, -250)
t.goto(-200, -200)
t.pu()
t.goto(-200, -225)
t.color(TextField.TextFieldBGColor)
t.pensize(48)
t.pd()
t.forward(400)
t.pu()
t.goto(-190, -220)
t.color(TextField.TextFieldTextColor)
# Defines the function for each defined key.
def ShiftLON(self):
print("Capslock toggled.")
self.key_shiftL = not self.key_shiftL
def Space(self):
self.turtle.write(' ')
self.inp.append(' ')
self.turtle.forward(self.s)
def Backspace(self):
try:
self.inp.pop(-1)
except IndexError:
print("Cannot backspace!")
else:
t = self.turtle
t.pensize(15)
t.color(TextField.TextFieldBGColor)
t.forward(10)
t.backward(self.TextSeparation)
t.shape('square')
t.pd()
t.turtlesize(1.3) # <<< Doesn't work on repl.it
t.stamp()
t.pu()
t.color(TextField.TextFieldTextColor)
t.shape('classic')
t.backward(10)
def Period(self):
if self.key_shiftL:
self.turtle.write('>')
self.inp.append('>')
self.turtle.forward(self.s)
else:
self.turtle.write('.')
self.inp.append('.')
self.turtle.forward(self.s)
def Comma(self):
if self.key_shiftL:
self.turtle.write('<')
self.inp.append('<')
self.turtle.forward(self.s)
else:
self.turtle.write(',')
self.inp.append(',')
self.turtle.forward(self.s)
def Enter(self):
if self.inp != []:
print("Joining input log...")
self.turtle.pu()
self.FullOutput = ''.join(self.inp)
print('joined.')
print(self.FullOutput)
print("Output printed.")
try:
self.callBack(self.FullOutput)
print("Data sent to callback.")
except NameError:
print("No callback defined.")
self.turtle.clear()
print("Display cleared.")
def digit(self, d):
if self.key_shiftL:
d = TextField.ShiftedDigits[d]
self.turtle.write(d)
self.inp.append(d)
self.turtle.forward(self.s)
def letter(self, abc):
if self.key_shiftL:
abc = abc.upper()
self.turtle.write(abc)
self.inp.append(abc)
self.turtle.forward(self.s)
def listenforkeys(self, flag): # Whether or not keys are being used for text field.
s = Screen()
if not flag:
for character in 'abcdefghijklmnopqrstuvwxyz':
s.onkey(None, character)
for digit in '0123456789':
s.onkey(None, digit)
s.onkey(None, 'period')
s.onkey(None, 'comma')
s.onkey(None, 'Shift_L')
# s.onkeyrelease(None, 'Shift_L')
s.onkey(None, 'space')
s.onkey(None, 'BackSpace')
s.onkey(None, 'Return')
if self.FullOutput or self.inp:
self.FullOutput = "" # Reset the text field content
self.inp = [] # Reset input log
print("Stopped listening.")
if flag:
for character in 'abcdefghijklmnopqrstuvwxyz':
s.onkey(lambda abc=character: self.letter(abc), character)
for character in '1234567890':
s.onkey(lambda d=character: self.digit(d), character)
s.onkey(self.Period, 'period')
s.onkey(self.Comma, 'comma')
s.onkey(self.ShiftLON, 'Shift_L')
# s.onkeyrelease(self.ShiftLON, 'Shift_L')
s.onkey(self.Space, 'space')
s.onkey(self.Backspace, 'BackSpace')
s.onkey(self.Enter, 'Return')
s.listen()
print("Listening.")
if __name__ == "__main__":
def text_callback(text):
print("Data received by callback.")
textField.listenforkeys(False)
turtle.pu()
print("Pen up.")
turtle.write(text, align='center', font=('Arial', 30, 'normal'))
print("Text written.")
screen = Screen()
screen.setup(500, 500)
textField = TextField(text_callback)
textField.DrawTextField("Enter Text. Note: Shift is capslock. Capslock disables your keys.")
print("Text field drawn.")
textField.listenforkeys(True)
print("Can type.")
turtle = Turtle(visible=False)
mainloop()
推荐阅读
- r - R for循环与字符列表
- javascript - Javascript在“内部”插入一个对象(每个索引都有对象)一个对象数组
- php - Yii2:如何使用 POST 方法重定向?
- c - scanf 中的 %d 不起作用。号码 4223092 出现
- python - 如何使用python获取两个地理坐标之间的行驶距离?
- r - r markdown HTML中的渲染问题交叉引用方程
- mocha.js - 如何对使用 apollo-resolvers 创建的 Graphql Resolver 函数进行单元测试
- c# - 手动调用 EventHandler 时出现无意义的错误消息
- python - sklearn TfidfVectorizer:如何让几个词只成为特征中二元组的一部分
- reactjs - Ag-Grid 无限滚动分页页面大小在 reactjs 中不起作用