<p>首先,有几个小问题:</p>
<pre><code>def listenforkeys(bool):
</code></pre>
<p><code>bool</code>是Python关键字,请选择其他变量名。(例如<code>flag</code>)这个<code>or</code>不是你想的那样:</p>
<pre><code>if TextField.FullOutput and TextField.inp != "" or []:
</code></pre>
<p>重读<code>or</code>。不要将<code>TextField</code>实现中使用的turtle与<code>TextField</code>使用中使用的turtle相同,如下语句:</p>
<pre><code>t.clear()
</code></pre>
<p>清除<code>TextField</code>用户对<code>t</code>所做的所有操作。换一只海龟。最后,您对<code>mainloop()</code>的调用位于错误的位置。一旦调用它,代码就会停止,tkinker事件处理程序就会接管。它通常应该是你的代码的最后一件事。你知道吗</p>
<p>现在主要的问题是利用率代码:</p>
<pre><code>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
</code></pre>
<p>不要循环等待缓冲区填充。这确实应该是一个<em>事件</em>,但至少是一个<em>回调</em>。我在下面重写了您的代码,使其成为回调,请参见<code>Enter()</code>函数和示例用法代码。它现在在IDLE和命令提示符下为我工作。我也做了很多其他的小改动来尝试清理一些,其中一些可能需要进一步的测试。。。你知道吗</p>
<pre><code># 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()
</code></pre>