Создание встроенного текстового поля для черепахи, в то время как оператор не работает - PullRequest
0 голосов
/ 11 февраля 2019

Я создал модуль текстового поля, в котором есть одна проблема: почему Python IDLE не работает для операторов while ... break?

Изначально у меня не было оператора break, и это не сработалопоэтому я добавил оператор break, и те же проблемы не исчезли.

Это длинный сценарий.Вам понадобится все в этом.Не запускайте в repl.it, так как он не будет работать.Однако он работает на IDLE.

https://repl.it/@SUPERMECHM500/TextField

Как прокомментировано в скрипте, оператор while в строке 610 не загружается на IDLE, а break не работаеткак и ожидалось: продолжайте код, если объект TextField.FullOutput имеет текст.

Ни одна из моих проблем не связана с repl.it, поэтому не упоминайте об этом в своих ответах.Запустите и отладьте этот скрипт как текстовый файл из Python IDLE.

1 Ответ

0 голосов
/ 11 февраля 2019

Во-первых, несколько незначительных проблем:

def listenforkeys(bool):

bool - это ключевое слово Python, выберите другое имя переменной.(Например, flag.) Это or не работает так, как вы думаете:

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

Перечитайте о or.Не используйте ту же черепаху для реализации TextField, которую вы используете для использования TextField, как это утверждение:

t.clear()

стирает все действия, выполненные с t пользователем TextField.Используйте другую черепаху.Наконец, ваш звонок по номеру mainloop() находится не в том месте.Как только вы вызываете его, ваш код останавливается и обрабатывается обработчик событий tkinker.Как правило, это должно быть последнее, что ваш код des.

Теперь главная проблема, этот код использования:

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