Ошибка
if os.path.isfile(self.filename + ".txt") is True:
Ошибка типа: неподдерживаемый тип (ы) операндов для +: 'method' и 'str'
Причина корня
Код filename = MainScreen().btn
создает новый экземпляр MainScreen
и указывает на метод btn()
.Этот новый экземпляр отличается от этого экземпляра, MainScreen:
в файле kv.Следовательно, значение, присвоенное self.filename
, равно method MainScreen.btn
, которое имеет тип class method
.
Решение
Существует два решения проблемы.
Метод 1
Py file
- Добавить
import
оператор для StringProperty
- В
class DrawInput()
, заменить filename = MainScreen().btn
на filename = StringProperty('')
Snippets - py
from kivy.properties import ObjectProperty, StringProperty
...
class DrawInput(Widget):
filename = StringProperty('')
kv файл
- Добавить
id: main
к созданному виджету, MainScreen:
- Добавить
id: drawing
к установленному виджету, DrawInput:
- Добавить
on_pre_enter
событие для инициализации filename
Фрагменты - kv
ScreenManagement:
transition: FadeTransition()
MainScreen:
id: main
SecondScreen:
AnotherScreen:
...
<SecondScreen>:
name: "drawing"
on_pre_enter:
self.ids.drawing.filename = self.manager.ids.main.username.text
FloatLayout:
DrawInput:
id: drawing
Метод 2
Используя комбинацию следующего:
- Используйте
App.get_running_app()
для получения app
объекта - Используйте
root.get_screen('main')
для получения MainScreen
объекта - Используйте
username.text
для извлечения текста TextInput
Фрагмент
def on_touch_down(self, touch):
self.filename = App.get_running_app().root.get_screen('main').username.text
Примечание. Загрузка файла kv
В своем приложении Kivy старайтесь не загружать файл kv , используя оба метода, т.е. загрузку по именисоглашение и загрузка Строителем.Используйте только один метод.
Существует два способа загрузки кода Kv в ваше приложение:
По соглашению имен:
Kivy ищет файл Kv с тем же именем, что и у вашего класса App, в нижнем регистре, за исключением «App», если он заканчивается на «App», например:
ApplePenApp -> applepen.kv
или
ApplePen -> applepen.kv
Если этот файл определяет Root Widget , он будет присоединен к атрибуту root приложения и будет использоваться как основа виджета приложения.tree.
По соглашению Builder:
Вы можете указать Kivy непосредственно загружать строку или файл.Если эта строка или файл определяет корневой виджет, он будет возвращен методом:
Builder.load_file('path/to/file.kv')
или:
Builder.load_string(kv_string)
Фрагмент - Py
class ApplePen(App):
pass
if __name__ == "__main__":
ApplePen().run()