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
Ö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.
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
Rica ederim iyi çalışmalar
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()
Siz gerçekten bu işin ehlisiniz. Kodları inceledim ve gerçekten iyi bir çözüm. Bunları kendime uyarlayacam. Gerçekten size minnetdarım.