0
votes

Been programming a Kivy interface for a Caesar cypher I've done a few days ago and I'm running into an error (see title) I can't seem to get through. I'll put my code underneath, as well as the full traceback which can probably help.

import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button

class Cypher:

    def __init__(self):

        MAX_KEY_SIZE = 26


    '''def getMode(self)        

        while True:



            print('Do you wish to encrypt or decrypt a message?')
            mode = input().lower()
            if mode in 'encrypt e decrypt d'.split():
                return mode
            else:
                print('Enter either "encrypt" or "e" or "decrypt" or "d".')'''

    def getMessage(self):

            print('Enter your message:')
            return input()

    def getKey(self):

            key = 0
            while True:
                print('Enter the key number (1-%s)' % (MAX_KEY_SIZE))
                key = int(input())
                if (key >= 1 and key <= MAX_KEY_SIZE):
                    return key

    def getTranslatedMessage(self, mode, message, key):

        '''if mode[0] == 'd':
            key = -key'''

        self.msg = ''

        self.msg += message

        translated = ''

        for char in self.msg:
            if char.isalpha():
                num = ord(char)
                num += key
                if char.isupper():
                    if num > ord('Z'):
                        num -= 26
                    elif num < ord('A'):
                        num += 26
                elif char.islower():
                    if num > ord('z'):
                        num -= 26
                    elif num < ord('a'):
                        num += 26
                translated += chr(num)
            else:
                translated += char

        return translated

    def func(self):

        mode = self.getMode()
        message = self.getMessage()

        key = self.getKey()


#    print('Your translated text is:')

        return self.getTranslatedMessage(mode, message, key)


class StartPageKivy(GridLayout):

    def __init__(self, **kwargs):

        super().__init__(**kwargs)

        c = Cypher()

        self.cols = 2

        self.encButton = Button(text='Encrypt')
        self.encButton.bind(on_press = self.encryptionMode)
        self.add_widget(self.encButton)
        self.decButton = Button(text='Decrypt')
        self.decButton.bind(on_press = self.decryptionMode)
        self.add_widget(self.decButton)

        self.add_widget(Label(text='Insert the key'))
        self.key = TextInput(multiline=False)
        self.add_widget(self.key)

        self.add_widget(Label(text='Insert the message'))
        self.message =  TextInput(multiline=False).text
        self.add_widget(self.message)

        self.add_widget(Label(text='The result is :'))

        self.mode = ''

        while self.mode not in 'e d':

            if self.encryptionMode() == True:
                self.mode = 'e'
            elif self.decryptionMode() == True:
                self.mode = 'd'

        self.result = c.getTranslatedMessage(self.mode, self.message, self.key)

        self.add_widget(Label(text=self.result))

    def encryptionMode(self, instance):

        return True

    def decryptionMode(self, instance):

        return True

class EpicApp(App):

    def build(self):

        return StartPageKivy()

class StartPageTkinter():

    pass

if __name__ == '__main__':
    EpicApp().run()

runfile('C:/Users/danburnier/Desktop/PythonPrograms/AveCypher.py', >wdir='C:/Users/danburnier/Desktop/PythonPrograms') Traceback (most recent call last):

File "", line 1, in runfile('C:/Users/danburnier/Desktop/PythonPrograms/AveCypher.py', >wdir='C:/Users/danburnier/Desktop/PythonPrograms')

File "C:\Users\danburnier\AppData\Local\Continuum\anaconda3\lib\site->packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile execfile(filename, namespace)

File "C:\Users\danburnier\AppData\Local\Continuum\anaconda3\lib\site->packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile exec(compile(f.read(), filename, 'exec'), namespace)

File "C:/Users/danburnier/Desktop/PythonPrograms/AveCypher.py", line 152, in EpicApp().run()

File "C:\Users\danburnier\AppData\Local\Continuum\anaconda3\lib\site-packages\kivy\app.py", line 829, >in run root = self.build()

File "C:/Users/danburnier/Desktop/PythonPrograms/AveCypher.py", line 145, in build return StartPageKivy()

File "C:/Users/danburnier/Desktop/PythonPrograms/AveCypher.py", line 117, in init self.add_widget(self.message)

File "C:\Users\danburnier\AppData\Local\Continuum\anaconda3\lib\site-packages\kivy\uix\layout.py", >line 92, in add_widget fbind = widget.fbind

AttributeError: 'str' object has no attribute 'fbind'

Thanks in advance for your help.

1

1 Answers

2
votes

I don't have an environment to run your code, but looking at the traceback my guess is the problem is here:

    self.message =  TextInput(multiline=False).text
    self.add_widget(self.message)

The problem is probably the '.text' at the end of the first line. My guess is text (stored in self.message here) is not a valid widget. Try removing '.text' or changing the second line to:

    self.add_widget(Label(text=self.message))