Я пытаюсь создать приложение для дел. У меня есть таблица в sqlite3, в которой хранится некоторая информация. Я хотел бы вызвать функцию, которая запрашивает эту таблицу при запуске приложения.
Вот мой код:
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()
#:kivy 1.9.1
MyRootasdasd:
rows: 1
RightArea:
:
#rows: 1
#RightArea:
:
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
:
cols: 2
spacing: '.5dp'
size_hint_y: None
height: self.minimum_height
:
size_hint_y: 1
text: 'SMS'
on_press: self.reloadSession()
:
size_hint_y: 1
text: 'Get links'
on_press: self.get_caption()
:
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). Как я могу это сделать, но автоматически при запуске приложения?
Я пробовал использовать функцию сборки в alla, но получаю эту ошибку:
(«Объект «Тест» не имеет атрибута «links_grid»»,)
сейчас я использую следующий код..
Я пытаюсь создать приложение для дел. У меня есть таблица в sqlite3, в которой хранится некоторая информация. Я хотел бы вызвать функцию, которая запрашивает эту таблицу при запуске приложения. Вот мой код: Python:[code]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)
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() [/code] КВ: [code]#:kivy 1.9.1
: 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' [/code] Функция, которую мне нужно вызвать, — это reloadSession, которая запросит таблицу, а затем с получением информации создаст n кнопок. Как вы можете видеть, в классе SmsButton (в KV) вызывает эту функцию (ON_PRESS). Как я могу это сделать, но автоматически при запуске приложения? Я пробовал использовать функцию сборки в alla, но получаю эту ошибку: («Объект «Тест» не имеет атрибута «links_grid»»,) сейчас я использую следующий код.. [code]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" [/code] Тестовый класс не имеет атрибута linked_grid.