2015-01-02 3 views
0

Я попытался сделать собственный кокет-кликер, поэтому я создал виджет kivy и объявил изображение кучки как часть его. Каждый раз, когда вы нажимаете на wiget, счетчик поднимается, и номер отображается на этикетке. Все пошло нормально, после того как я получил помощь здесь, при переполнении стека, но теперь я столкнулся с проблемой, что виджет большой, поэтому, даже если я нажму на правый верхний угол, чтобы счетчик поднялся, aldoug я не нажал на кокет. Вот исходный код:Виджет Kivy больше, чем должен быть

from kivy.app import App 
from kivy.lang import Builder 

from kivy.uix.widget import Widget 
from kivy.uix.label import Label 
from kivy.core.window import Window 

from kivy.clock import Clock 
from kivy.animation import Animation 
from kivy.core.text.markup import * 

from kivy.uix.floatlayout import FloatLayout 
from kivy.properties import NumericProperty 
from kivy.properties import StringProperty 

Builder.load_string(''' 
<Root>: 

    Kecks: 
     pos: 300, 300 
     size: 100, 100 
<Kecks>: 

    Image: 
     pos: root.pos 
     id: my_image 
     source: root.weg 

    Label: 
     id: my_Label 
     font_size: 50 
     text: root.txt 
     center_x: 345 
     center_y: 200  
''') 

class Root(FloatLayout): 
    def __init__(self, *args, **kwargs): 
     super(Root, self).__init__(*args, **kwargs) 

class Kecks(Widget): 

    count = NumericProperty(0) 
    amount = NumericProperty(1) 
    txt = StringProperty() 
    level = NumericProperty(1) 
    weg = StringProperty('piernik.png') 

    def __init__(self, *args, **kwargs): 
     super(Kecks, self).__init__(*args, **kwargs) 
     #self.txt = str(self.count) 
     Clock.schedule_interval(self.Update, 1/60.) 

    def Update(self, *args): 
     self.txt = str(self.count) 
    def on_touch_down(self, touch): 
     if self.collide_point(*touch.pos): 
      self.count += self.amount 


class app(App): 
    def build(self): 
     Window.clearcolor = (10, 0, 0, 1) 
     return Root() 

if __name__ == "__main__": 
    app().run() 

ответ

2

Проблема в том, вы не определили свои collide_points, в каком районе вы хотите, что событие, которое вызвало.

Рассмотрим, если вы хотите, чтобы ваши collide_points на вашем my_image, чтобы вызвать on_touch_down случае, вам нужно настроить так:

def on_touch_down(self, touch): 
    # to check if touch.pos collides on my_image 
    if self.ids.my_image.collide_point(*touch.pos): 
     self.count += self.amount 

Также возможно рассмотреть вопрос об использовании pos_hint и size_hint как это поможет вам с совместимостью с вашим приложением, работающим на разных устройствах (например, размером экрана), а не с использованием абсолютного размера и/или положения.

Надеюсь, это поможет.

+0

У меня есть на изображении или на уровне виджета? – Gilgamesch

+0

@Gilgamesch Я считаю, что просто измените свой существующий код ** on_touch_down ** с вашим ** классом ** Kecks **. – Anzel

+0

Большое спасибо – Gilgamesch

Смежные вопросы