Skip to content Skip to sidebar Skip to footer

Building A Built-in Text Field For Turtle, While Statement Doesn't Work

I have built a text field module that has one problem: why does Python IDLE not work for while...break statements? Originally I didn't have a break statement and this didn't work s

Solution 1:

First, a few minor issues:

deflistenforkeys(bool):

bool is a Python keyword, choose a different variable name. (E.g. flag.) This or doesn't work the way you think:

if TextField.FullOutput and TextField.inp != "" or []:

Reread about or. Don't use the same turtle for TextField implementation that you use for TextField utilization as this statement:

t.clear()

wipes out all the actions done with t by user of TextField. Use a different turtle. Finally, your call to mainloop() is in the wrong place. Once you invoke it, your code stops and the tkinker event handler takes over. It generally should be the last thing your code des.

Now the main issue, this utilization 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

Don't loop waiting on the buffer to fill. This really should be an event, but at least a callback. I've rewritten your code below to make this a callback, see the Enter() function and example usage code. It now works for me in IDLE and at the command prompt. I've also made lots of other little changes to try to clean it up a bit -- some of these may need further testing...

# 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

classTextField:
    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 = FalsedefDrawTextField(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.defShiftLON(self):
        print("Capslock toggled.")
        self.key_shiftL = not self.key_shiftL

    defSpace(self):
        self.turtle.write(' ')
        self.inp.append(' ')
        self.turtle.forward(self.s)

    defBackspace(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)

    defPeriod(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)

    defComma(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)

    defEnter(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.")

    defdigit(self, d):
        if self.key_shiftL:
            d = TextField.ShiftedDigits[d]

        self.turtle.write(d)
        self.inp.append(d)
        self.turtle.forward(self.s)

    defletter(self, abc):
        if self.key_shiftL:
            abc = abc.upper()

        self.turtle.write(abc)
        self.inp.append(abc)
        self.turtle.forward(self.s)

    deflistenforkeys(self, flag):  # Whether or not keys are being used for text field.
        s = Screen()

        ifnot 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 logprint("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__":

    deftext_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()

Post a Comment for "Building A Built-in Text Field For Turtle, While Statement Doesn't Work"