Kivy在应用启动时重新加载按钮(通过功能)

时间:2016-03-07 10:44:52

标签: python kivy startup

嗨我是python和kivy的新手,我想做一个简单的"做"应用..我的代码看起来很可怕,我知道,我很抱歉... 我在sqlite3中有一个表,其中存储了一些信息。我想调用一个在app启动时查询此表的函数。我无法弄清楚如何使它工作..这是我的代码

的Python:

import sqlite3
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.popup import Popup
from kivy.uix.textinput import TextInput 
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.togglebutton import ToggleButton
from kivy.clock import Clock
from kivy.uix.floatlayout import FloatLayout
from functools import partial


class GetLinksButton(Button):


    def get_caption(self):
#       DEFINIZIONE CHE SI POTREBBE FARE IN KV .. CREAZIONE POPUP CON 2 BOTTONI E TEXTINPUT
        content = BoxLayout(orientation='vertical')
        txt = TextInput(text = "",focus=False,multiline=False,size_hint=(1,0.2),font_size= 40)
        content.add_widget(txt)
        mybutton = Button(text='Add',size_hint=(1,0.2),font_size=20)
        mybutton2 = Button(text='Close',size_hint=(1,0.2),font_size=20)
        content.add_widget(mybutton)
        content.add_widget(mybutton2)

        mypopup = Popup(title = 'Add item to list',
            content = content,
            size_hint = (1, 0.4),
            auto_dismiss = False,
            ).open()

        def saveTxt(tt):
            mypopup.dismiss()   # FUNZIONE CHIAMATA, CHIUSURA POPUP
            try:
                self.set_caption(txt.text)  # CHIAMA FUNZIONE DI CREAZIONE BOTTONE CON ARG IL CAPTURE DEL TESTO IN TEXTBOX
            except:
                pass

        mybutton.bind(on_press = saveTxt)  # CHIAMA FUNZIONE DI CAPTURE DEL TESTO E CHIUSURA POPUP
        txt.bind(on_text_validate = saveTxt)# CHIAMA FUNZIONE DI CAPTURE DEL TESTO E CHIUSURA POPUP
        mybutton2.bind(on_press = mypopup.dismiss)


#   FUNZIONE CHIAMATA PER INSERIMENTO NUOVO BOTTONE IN TABELLA LOCALTB
    def btn_db(self,st):
        #con = None
        elementList =[]
        print "stringa dentro a dtn_db "+ st

        try:
            con = sqlite3.connect('localdb.db')
            cur = con.cursor()
            cur.execute("insert into localtb (Item, State) values ( ?, ?)",(st, 0))
            con.commit()
            cur.execute("select * from localtb")
            data = cur.fetchall()
            con.close()
            for x in data:
                print x
                elementList.append(x[0])
        except:
            print "non va"
        w = str(elementList)
        return w


#   CREAZIONE BOTTONE DA INPUTO DI TESTO , TEXT BUTTON == INPUT INSERITO IN BOX
    def set_caption(self,stringa):
        string = stringa[0].upper()+stringa[1:].lower()
        print string, " stringa prima del for"
        # DA SISTEMARE CICLO "INUTILE"
        #for i in range(1):
        link_button = LinkButton(
            text = string)
        print "tra for e add_widget"
        self.links_grid.add_widget(link_button)
        print string," strinda PRIMA call a btn_db"
        self.btn_db(string)          # CALL A FUNZIONE PER INSERIRE IL BOTTONE IN TABELLA LOCALE (LOCALTB)
        print string," strinda DOPO call a btn_db"


class LinkButton(ToggleButton):

#   GESTIONE DEL TOGGLE.. QUNANDO SI TOGGLA IL BOTTONE PARTE LA QUERY E INVERTE LO STATO ATTUALE CON L'ALTRO STATO , DA 0 A 1 E VICEVERSA PER IL BOTTONE PREMUTO
    def toggleState(self):
        #con = None
        red = (83,0,0,1)
        green = (0,83,0,1)
        print self.background_color
        if self.background_color == [83,0,0,1]:
            self.background_color = green
        else:
            print "dentro ELSE"
            self.background_color = red
        elementList =[]
        pressed = str(self.text)
        print "tasto premuto cambio stato: "+pressed
        try:
            con = sqlite3.connect('localdb.db')
            cur = con.cursor()
            cur.execute("update localtb set State = (CASE WHEN State = 0 THEN State + 1 WHEN State = 1 THEN State - 1 end ) WHERE Item = ?",(pressed,))  # ATTENTO ALLA VIRGOLA DOPO PRESSED(SE NON NON FUNZIONA)
            con.commit()
            cur.execute("select * from localtb")
            data = cur.fetchall()
            con.close()
            for x in data:
                print x
                elementList.append(x[0])
        except:
            print "non va"
        w = str(elementList)
        return w



class SmsButton(Button):

#   PROVE DI RELOAD SESSIONE PRECENDETE- FALLITE.
    def reloadSession(self):
        try:
            con = sqlite3.connect('localdb.db')
            cur = con.cursor()
            cur.execute("select * from localtb")
            data = cur.fetchall()
            con.close()
            for x in data:
                reload_Element = str(x[0])
                if x[1] == 0:
                    print "in if: ", x[1]
                    link_button = LinkButton(text = reload_Element,background_color = [83,0,0,1])
                else:
                    print "in else: ", x[1]
                    link_button = LinkButton(text = reload_Element,background_color = [0,83,0,1])
                self.links_grid.add_widget(link_button)
        except Exception as inst:
            print inst.args
            print "non va"


class Test(App):
    pass


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

KV:

#:kivy 1.9.1

MyRootasdasd: 
    rows: 1
    RightArea:


<MyRootasdasd@GridLayout>: 
    #rows: 1
    #RightArea:



<RightArea@GridLayout>:
    cols: 1
    size_hint_x: 0.3
    spacing: '1dp'

    ScrollView:
        LinksGrid:
            id: links_grid

    BoxLayout:
        size_hint: (1,0.08)


        GetLinksButton:
            links_grid: links_grid

        SmsButton:
            links_grid: links_grid


<LinksGrid@GridLayout>:
    cols: 2
    spacing: '.5dp'
    size_hint_y: None
    height: self.minimum_height

<SmsButton>:
    size_hint_y: 1 
    text: 'SMS'
    on_press: self.reloadSession()


<GetLinksButton>:

    size_hint_y: 1
    text: 'Get links'
    on_press: self.get_caption()    

<LinkButton>:
    color: (0, 0, 0, 1)   #COLORE TESTO
    background_normal: '' # RESET DELLA TINTA (STRINGA, quindi carica un immagine non un colore)
    background_color: (83, 0, 0, 1) #COLORE SFONDO -> qui sotto la call alla classe che gestisce il toggle del bottone
    on_release: self.toggleState()
    size_hint_y: None
    height: '80dp'

有些代码未被使用,请不要担心。 我需要调用的函数是reloadSession,查询表然后用检索到的信息创建n个按钮... 正如你所看到的,在SmsButton类(在KV中)调用该函数(ON_PRESS),我需要做同样的事情,但是在app启动时自动...我该怎么办?

抱歉我的英文和编码不好......我是新手,我正在尝试很多东西,我将非常感谢你的帮助。

谢谢。

伊凡。

编辑:删除未使用的代码

编辑:@ bj0 感谢您的提示..我已经尝试过以我所知道的方式使用构建功能。但它不起作用......我得到这个错误 (&#34;&#39;测试&#39;对象没有属性&#39; links_grid&#39;&#34;,) 现在使用的代码就是这个..

class Test(App):
    def build(self):
        try:
            con = sqlite3.connect('localdb.db')
            cur = con.cursor()
            cur.execute("select * from localtb")
            data = cur.fetchall()
            con.close()
            for x in data:
                reload_Element = str(x[0])
                if x[1] == 0:
                    print "in if: ", x[1]
                    link_button = LinkButton(text = reload_Element,background_color = [83,0,0,1])
                else:
                    print "in else: ", x[1]
                    link_button = LinkButton(text = reload_Element,background_color = [0,83,0,1])
                self.links_grid.add_widget(link_button)
        except Exception as inst:
            print inst.args
            print "non va"

显然Test类没有links_grid属性..但是我该如何解决这个问题呢? 再次感谢

0 个答案:

没有答案