правильно передавая аргументы классу - Kivy gui - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь выучить OOP и возиться с Киви, я сделал начальную страницу с фоновым изображением и lo go, который функционирует как кнопка, пока все хорошо.

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.uix.image import AsyncImage, Image
from kivy.uix.behaviors import ButtonBehavior  
from kivy.uix.image import Image

# dir 
src='C:\\Users\\Scott\\projects\\Kivy\\botGUI\\static\\ims\\mainResize.png'
src2='C:\\Users\\Scott\\projects\\Kivy\\botGUI\\static\\ims\\etoro.png'

# make window same size as background image:
from kivy.config import Config
Config.set('graphics', 'width', '960')
Config.set('graphics', 'height', '600')

class rootWidget(FloatLayout):
    def __init__(self,**kwargs):
        super(rootWidget, self).__init__(**kwargs)
        self.add_widget(AsyncImage(source=src))

# use logos in dir for buttons
class myButton(ButtonBehavior, Image): 
    def __init__(self,**kwargs):
        super(myButton, self).__init__(**kwargs)
        self.source = 'C:\\Users\\Scott\\projects\\Kivy\\botGUI\\static\\ims\\etoro.png'
        self.size_hint=(.25,.25)
        self.pos_hint={'center_x':.15,'center_y':.85}

    def on_press(self):  
        print ('etoro pressed')     

class mainApp(App):

    def build(self):
        self.root = root = rootWidget()
        root.add_widget(myButton())  
        return root

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

следующим шагом будет итерация по подкаталогу и создание кнопки для каждого lo go, поэтому мне не нужно будет жестко их кодировать, поэтому в качестве первого шага я изменю класс myButton, чтобы удалить зашифрованная информация в классе:

текущая

class myButton(ButtonBehavior, Image): 
    def __init__(self,src,xs,ys,xc,yc):
        self.src = src
        self.xs = xs
        self.ys = ys
        self.xc = xc
        self.yc = yc
        super(myButton, self).__init__()

    def drawButton(self):
        self.source = src
        self.size_hint=(xs,ys)
        self.pos_hint={'center_x':xc,'center_y':yc}

    def on_press(self):  
        print ('pressed',src)

и настройка метода сборки:

class mainApp(App):

    def build(self):
        self.root = root = rootWidget()
        root.add_widget(myButton(src2,0.1,0.1,0.,0.).drawButton)


        return root

это выдает ошибку:

Traceback (most recent call last):
   File "t.py", line 60, in <module>
     mainApp().run()
   File "C:\Users\Scott\projects\Kivy\envs\lib\site-packages\kivy\app.py", line 829, in run
     root = self.build()
   File "t.py", line 54, in build
     root.add_widget(myButton(src2,0.1,0.1,0.,0.).drawButton)
   File "C:\Users\Scott\projects\Kivy\envs\lib\site-packages\kivy\uix\floatlayout.py", line 135, in add_widget
     widget.bind(
 AttributeError: 'function' object has no attribute 'bind'

Мой вопрос заключается в том, правильно ли я использую класс и передаю аргументы, но допустил ошибку еще где (мое подозрение супер) или я что-то упустил в отношении ОО?

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Надеюсь, это может помочь кому-то еще, я неправильно понял, как использовать ОО, а также то, что я пытался сделать в Киви!

# current
from kivy.app import App
from kivy.graphics import Color, Rectangle
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.image import AsyncImage
from kivy.lang import Builder 
from kivy.uix.behaviors import ButtonBehavior  
from kivy.uix.image import Image

from kivy.uix.label import Label
import os

rootDir='C:\\Users\\Scott\\projects\\Kivy\\botGUI\\static\\ims\\logos\\'
contents = os.listdir(rootDir)

bkgrd='C:\\Users\\Scott\\projects\\Kivy\\botGUI\\static\\ims\\mainResize.png'

from kivy.config import Config
Config.set('graphics', 'width', '960')
Config.set('graphics', 'height', '600')

class rootWidget(FloatLayout):
    def __init__(self,**kwargs):
        super(rootWidget, self).__init__(**kwargs)
        self.add_widget(AsyncImage(source=bkgrd))


class myButton(ButtonBehavior, Image): 
    def __init__(self,**kwargs):
        super(myButton, self).__init__(**kwargs)

    def on_press(self):  
        print ('pressed',self.source)


class mainApp(App):

    def build(self):
        self.root = root = rootWidget()
        layout = GridLayout(cols=2)
        for logo in contents:
            path = rootDir+logo
            layout.add_widget(myButton(source=path))

        root.add_widget(layout)


        return root

if __name__ == '__main__':
    mainApp().run()
0 голосов
/ 25 марта 2020
root.add_widget(myButton(src2,0.1,0.1,0.,0.).drawButton)

drawButton - это метод класса, но add_widget ожидает получить виджет в качестве аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...