Kivy kullanarak bilgi yarışması yapmak

Merhabalar değerli yazbel ailesi.
Ben kivy ile bir bilgi yarışması yapmak istiyorum. Hayalim şu: Kullanıcıya her soru için belli bir süre verilecek bu süre sonunda diğer soruya geçilecek. Bir de pas geçme düğmesi olacak. Eğer kullanıcı bu düğmeye basarsa sürenin bitmesi beklenmeden yeni soruya geçilecek. Bunun için ‘Screen’ leri kullanmak aklımdan geçti. Birçok soru olacağından bir çok ‘Screen’ olmalı. Bu ScreenManager’in yavaş çalışmasına neden olmaz mı? Bu yöntem mantıklı mı? Eğer bir bilginiz veya fikriniz varsa lütfen paylaşın. YArdımcı olacak arkadaşlara şimdiden teşekkürler :slight_smile:

Öncelikle merhaba. Kısa zaman önce ben de sürekli Kivy ile geliştirme yapıyordum, bu yüzden hatırladığım bilgilerimle yardımcı olmak isterim.

Öncelikle ScreenManager kullanmak mantıklı, ama şöyle ki eğer Screen nesnelerini dinamik olarak oluşturursanız o zaman yavaş çalışmaz. Yani şunu demek istiyorum. Tüm soruları önceden bir Screen olarak oluşturup ScreenManager içine koymak yerine, soruya geçildiği anda bunu oluşturmak ve ScreenManager içine koymak lazım. Bu sefer de ScreenManager’de birikme olacak diyorsan, şunu demek isterim ki o zaman her seferinde ScreenManager içinde belirli sayıda screen tutmaya çalışırsın geçmiş soruların bilgilerini de bir veri yapısının içerisinde(kuyruk vs) tutarsın.

Aklıma gelen başka bir çözüm yolu da şu. Soruları bir Widget içinde hazırlayıp yeni soruya geçildiği zaman ekranda bu Widget’i göstermek, diğerini ekrandan silmek yani kaldırmak. Soruları düzenli bir yapı içerisinde tutarsan birinden diğerine geçmek zor olmaz senin için.

1 Like

Gerçekten zekanızı takdir ediyorum. Verdiğiniz çözümler gerçekten işime yarayacak ve çok mantıklı. Çok çok çok teşekkkürler :slight_smile: :slight_smile: :slight_smile: :slight_smile:

1 Like

Rica ederim iyi çalışmalar :slight_smile:

Oyun geliştiricileri sonsuz koşu oyunu tarzı oyunlarda şunu kullanıyorlar:

  • 2-3 dış çerçeve oluştur
  • Oyuncu çerçeveyi geçtikten sonra içeriğini değiştir
  • Yeni bir çerçeve gibi sona ekle

Bu tekniği buraya şöyle uyarlayabiliriz:

  • 2 Screen oluştur
  • Soru değiştikçe Screen değişsin
  • Kullanıcının görmediği Screende soru değişsin.

Teşekkürler kardeşlerim hasser ve coderistan. Gerçekten verdiğiniz bilgiler çok işe yarar cinsten.

hasser ve cderistan tekrardan belirtiyorum verdiğiniz çözümler çok güzel ama bunları nasıl gerçekleştireceğimi bilemedim. Birşeyler denedim ama olmadı. Tekrardan yardımınıza ihtiyacım var.

sevgili hasser ve coderistan verdiğiniz çözümleri gerçekleştirebilmek için onca yöntem denedim. Ama başaramadım. Ve hala sizden bir cevab bekliyorum.

Şöyle bir örnek yaptım, inceleyip fikrinizi belirtin.

#-*-coding:utf8;-*-

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.screenmanager import Screen,ScreenManager

# 100 tane soru örnek
sorular = [{"soru":str(i),"cevap":str(i*2)} for i in range(100)]

class TestApp(App):

    def build(self):
        duzen = BoxLayout (orientation="vertical")

        butonlar = BoxLayout(size_hint_y=.1)
       	butonlar.add_widget(Button(text="<",on_release=self.soru_degis))
       	butonlar.add_widget(Button(text=">",on_release=self.soru_degis))
        
        self.sayac = -1
        self.soru_label = Label(text="Hoşgeldiniz",markup=True)
        self.temp_screen = Screen(name="welcome")
        self.temp_screen.add_widget(self.soru_label)

       	self.ekran = ScreenManager()
        self.ekran.add_widget(self.temp_screen)

        self.bilgi = Label(text = "Bilgi",size_hint_y=.1)
        duzen.add_widget(self.bilgi)
       	duzen.add_widget(self.ekran)
       	duzen.add_widget(butonlar)

        return duzen

    def soru_degis(self,basilan_buton):
        # Şu andaki ekranı kaldırıyoruz
        self.ekran.remove_widget(self.temp_screen)

        if(basilan_buton.text == ">"):
            # ileri
            self.sayac = self.sayac+1 if self.sayac<len(sorular)-1 else len(sorular)-1
            self.ekran.transition.direction="left"
        else:
            # geri
            self.sayac = self.sayac-1 if self.sayac>0 else 0
            self.ekran.transition.direction="right"

        # sorular listesinden sıradaki soruyu alıyoruz
        siradaki_soru = sorular[self.sayac]

        # soruyu hazırlıyoruz
        self.soru_label = Label(markup=True,halign="center",text="[color=f00]Soru[/color]\n{}".format(siradaki_soru["soru"]))
    	self.temp_screen = Screen(name="{}".format(siradaki_soru["soru"]))
        self.temp_screen.add_widget(self.soru_label)

        # ekranda gösteriyoruz
        self.ekran.add_widget(self.temp_screen)
        self.ekran.current = siradaki_soru["soru"]

        self.bilgi.text = "Manager üzerindeki ekran sayısı: {}".format(len(self.ekran.screens))


TestApp().run()
1 Like

Siz gerçekten bu işin ehlisiniz. Kodları inceledim ve gerçekten iyi bir çözüm. Bunları kendime uyarlayacam. Gerçekten size minnetdarım.

1 Like