Programim dhe zhvillim, javascript, python, php, html

Si të krijoni një aplikacion dinamik kivy me kutitë e kontrollit?

Unë jam duke bërë një projekt për universitetin tim duke përdorur kivy dhe python. Unë dua të bëj një ekran kryesor ku mund të zgjidhni disa fusha dhe më pas ekrani tjetër do të varet nga fushat që keni zgjedhur në ekranin kryesor. Të bësh dinamikë me gjuhën kv është e vështirë për mua, sepse nuk di shumë për programimin me kivy, kështu që kam vendosur të bëj si programimin python, por nuk funksionon. Këtu keni kodin e programit tim:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button

Builder.load_string('''
<Root>:
    MainScreen:
        name: 'main'
    AnotherScreen:
        name: 'another'

<MainScreen>:
    GridLayout:
        cols: 2
        Label:
            text: "Select Subjects"
            font_size: 15
        Label:
            text: " "
        CheckBox:
            on_active:root.ping('ch1')
        Label:
            text: "Termotecnia"
        CheckBox:
            on_active:root.ping('ch2')
        Label:
            text: "Control"
        CheckBox:
            on_active:root.ping('ch3')
        Label:
            text: "Termotcnia"
        CheckBox:
            on_active:root.ping('ch4')
        Label:
            text: "Control"
        Button:
            text: "Exit"
            background_color: .7, .7, 6, 1
            on_release:root.parent.current='another'
        Button:
            text: "Run"
            font_size: 24
            background_color: .7, .7, 1, 1
            on_release: root.parent.current='another'


''')


class MainScreen(Screen):
    def __init__(self, **kw):
        super(MainScreen, self).__init__(**kw)
        self.a = App.get_running_app()
        self.e={}
    def ping(self,n):
        if self.a.big_dict[n]=='False':
            self.a.big_dict[n]='True'
        else: 
            self.a.big_dict[n]='False'
        print self.a.big_dict
        self.e=self.a.big_dict

class AnotherScreen(GridLayout):
    def __init__(self, **kw):
        super(AnotherScreen, self).__init__(**kw)
        t=[] 
        self.i=MainScreen()
        self.cols=2
        self.add_widget(Button(text='Assignatura',background_color=[0,1,1,1]))
        self.add_widget(Button(background_color=[0,1,1,1],text='Escriu Grup'))
        for k in self.i.e:
            if self.i.e[k]=='True':
                self.add_widget(Label(text=k))
                self.k=TextInput(multiline=False)
                t.append(self.k.text)
                self.add_widget(self.k)
            else:
                pass
        b1=Button(text='Exit',background_color=[0,1,0,1])
        self.add_widget(b1)
        b2=Button(text='Run',background_color=[0,1,0,1])
        self.add_widget(b2)
        b1.bind(on_press=exit)


class Root(ScreenManager):
    pass
class SimpleKivy(App):
    big_dict={'ch1':'False','ch2':'False','ch3':'False','ch4':'False'}
    def build(self):
        return Root()
SimpleKivy().run()

Ky kod nuk funksionon sepse ScreenManager punon vetëm me Screen, jo me GridLayout (problemi i parë). big_dict ruan të dhënat e kutive të kontrollit, por kur përpiqem të importoj në një klasë tjetër, nuk funksionon (një problem tjetër). Nëse dikush e di përgjigjen e këtyre problemeve do të ishte shumë i dobishëm, sepse unë di të bëj me p.sh. Gjithmonë 13 fusha, por dua të bëj me një parazgjedhje, sepse ka shumë fusha (në këtë program vetëm 4, por ka 14).


Përgjigjet:


1

Ku të fillojmë... Së pari, le të shohim SimpleKivy. Ju ndoshta dëshironi të bëni big_dict një DictProperty, në vend të një atributi të klasës:

class SimpleKivy(App):
    big_dict = DictProperty({'ch1':False,'ch2':False,'ch3':False,'ch4':False})

Unë gjithashtu i kam ndryshuar vlerat në booleans, sepse kjo do të jetë më e dobishme më vonë.

Pastaj, le të shtojmë një rregull tjetër për AnotherScreen në vargun kv:

<AnotherScreen>:
    GridLayout:
        id: container
        cols: 2

Në këtë mënyrë, ne mund t'i referohemi paraqitjes aktuale nga id e saj.

Ne gjithashtu ndryshojmë përkufizimin e ping:

def ping(self, n, value):
    self.a.big_dict[n] = value

Kur ne pastaj ndryshojmë edhe CheckBoxes në vargun kv

CheckBox:
    on_active:root.ping('ch1', self.active)

gjendja e kutisë së kontrollit do të transferohet drejtpërdrejt në fjalor në shembullin e aplikacionit. (Përndryshe, nëse nuk ju nevojitet ping për gjëra të tjera, kjo mund të thjeshtohet në on_active: app.big_dict['ch3'] = self.active)

Së fundi, përkufizimi i AnotherScreen:

class AnotherScreen(Screen):
    def on_pre_enter(self, *args):
        t=[] 
        a = App.get_running_app()
        self.ids.container.add_widget(Button(text='Assignatura',background_color=[0,1,1,1]))
        self.ids.container.add_widget(Button(background_color=[0,1,1,1],text='Escriu Grup'))
        for k,v in a.big_dict.iteritems():
            if v:
                self.ids.container.add_widget(Label(text=k))
                self.k=TextInput(multiline=False)
                t.append(self.k.text)
                self.ids.container.add_widget(self.k)
        b1=Button(text='Exit',background_color=[0,1,0,1])
        self.ids.container.add_widget(b1)
        b2=Button(text='Run',background_color=[0,1,0,1])
        self.ids.container.add_widget(b2)
        b1.bind(on_press=exit)

Kjo thirret përpara se të futet në ekran, do të marrë fjalorin drejtpërdrejt nga shembulli i aplikacionit (kështu që nuk ka nevojë t'i referoheni MainScreen) dhe do të përsëritet mbi fjalorin e përmendur.

15.03.2016
  • Aq e mahnitshme! A e dini se si ta vendosni titullin e ekranit kryesor kryesor në qendër të ekranit? (Zgjidhni subjektet) E di që është një pyetje pa kuptim, por nuk di aq shumë për kivy. Faleminderit shume. 15.03.2016
  • @A.Piquer ju mund të bëni një vertikale BoxLayout fëmijën e MainScreen, dhe më pas shtoni Label dhe GridLayout si fëmijët e saj 15.03.2016
  • Po përpiqem të shtoj më shumë fusha në ekranin kryesor, por programi nuk funksionon. A e dini pse ndodh kjo? Dua të shtoj 13 fusha dhe kur shtoj të tjera në fjalor dhe kutitë e kontrollit, programi kivy nuk funksionon. 16.03.2016
  • @A.Piquer nr. Mund të bëni një pyetje të re 16.03.2016
  • stackoverflow.com/questions/36022939/ Këtu është pyetja e re. Faleminderit! 16.03.2016
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..