Python GUI su Glade

S
  • 21 Bal '10

Nutariau pakurti programai grafine sasaja su glade irankiu. Jis man pasirode gana paprastas o grafine sasaja taip pat nesudetinga, todel pamaniau kad jo galimybiu pakaks. Tik susiduriu su kai kuriais niuansais, kuriuos gal galetu man pasakyt su situ daiktu jau susidure zmones.

pvz kuriant about dialoga jame galima ideti nuoroda i tam tikra puslapi. ten idedu labeli su nuoroda ir prie signalu kur activate priskiriu link_click.. atrodo turetu paspaudus kviesti link_click funkcija. Ji aprasyta taip:

def link_click(self,widget,data=None):
os.system("htmlview "+widget.get_uri())

bet spaudziant terminale gaunu errora kad sh: htmlview: command not found. Galbut cia trukumas kokiu biblioteku ar pan, bet esme kad neveikia ir nezinau tiksliai kame beda.

kitas dalykas tai su lango uzdarymo programavimu. tam naudoju funkcija:

def on_window1_remove(self,widget,data=None):
gtk.main_quit()

na paspaudus x lango kampe jis uzsidaro bet terminale programa dar veikia. tuo tarpu per file>close sitas metodas veikia ir pilnai iseina is programos.

Prie to pacio dar norejau pasiklaust kaip dirbama su radio buttonais? i grupes juos susiskirsciau, taciau kaip pythone apsiraso kuris radio button pasirinktas is esamu? nes pagrindinej programoj noreciau naudot if radio_button1== true ir kazka toliau daryt, bet pirma juk reikia aprasyt kuris is ju pasirinktas.

S
  • 22 Bal '10

na anksciau rasytus savo klausimus kaip ir issisprendziau bet vienoj vietoj tai reiketu kad mane uzvestu kas nors ant kelio nes nesuprantu pacio principo.

Kai mano programa budavo terminale tai realiu laiku apie jos eiga isvesdavau i ekrana su print. dabar pas mane naudojamas textview laukas ir visa ta informacija kuri budavo isvedama su print yra dedama i textbufferi. taciau kaip ta textbufferi perziuret realiu laiku?

apskritai pas mane programa su begaliniu ciklu, ji turi suktis istisai, istisai turi buti atnaujinami laukai, o ji suktis turi tik paspaudus start mygtuka.. bet dabar kai suprogramavau viska tai man visa info ismeta tik tada kai baigias programos vykdymas. tada gaunu "porcija" duomenu i visus laukus.

Matyt nesuprantu kazkokio principo, juk negali buti taip kad glade reikia po mygtuka kurt kiekvieno lango atnaujinimui kad parodytu pvz textbufferio informacija. Aciu jei uzvesit ant kelio.

D
  • 22 Bal '10

jei teisingai supratau, nori periodiškai atnaujinti info kažkokiam tekstiniam lange.
gal padėtų http://mail.python.org/pipermail/tutor/ ... 67970.html

be to, laukai gal gali būti kažkaip "surišti" su kintamaisiais, kad automatiškai atsinaujintų, pasikeitus kintamiesiems
gal http://faq.pygtk.org/index.py?req=show& ... 03.010.htp

dar aptikau http://www.linuxjournal.com/article/6586?page=0,3
apačioj yra log'inimo pavyzdys (gal pan tiks tau).

o jei nori pastoviai refreshint, gal tiks gtk.mainiteration() ,
nes suprantu jis pastoviai "sukasi" / reaguoja į įvykius, tai gal galima jame kartot ir kitus veiksmus

S
  • 24 Bal '10

yra gana naudingos informacijos. Kiek supratau man ko gero tiktu paleidinet gtk.mainiteration() jei yra tam tikru ivykiu. tuomet galbut atsinaujins langai ne tik tada kai visa programa bus prasukta. Apie sita paieskosiu daugiau info.

turbut dar tinkamas pavyzdys bus ir su loginimu, ten kiek supratau irgi vis atnaujinta info. Pavyzdyje pastebejau kad ten naudoja self.logwindow.insert_at_cursor(data,len(data)), tuo tarpu as visada naudojau get_buffer ir i ji dejau info. Galbut ir tame buvo problema.

Aciu uz issakytas mintis, siandien meginsiu visa tai realizuoti ir jei kils problemu vel tarsiuos. tikiuos kad sikart jau pavyks pajudet teisinga linkme, nesinori kiekvienai programos funkcijai deti atskirus mygtukus

S
  • 24 Bal '10

Po pirminiu bandymu galiu pasakyti kad veikia naudoju stai toki cikla:

while gtk.events_pending():
gtk.main_iteration(block=True)

veikimas toks kad vykdo programa, o priejus si cikla perpiesia viska laukuose kurie buvo iki to laiko atnaujinti ir toliau vykdo skaiciavimus.

Tik man idomu vienas dalykas. Tarkim pas mane programoj yra start ir stop mygtukai. kai paspaudziu start jis pasidaro ispaustas ir programa skaiciuoja, atlieka savo darba begaliniame cikle. reiketu mygtuko stop, kuris leistu pertraukti programos darba bet kuriuo metu, taciau neiseitu is pacio GUI. bet problema egzistuoja tame kad kol start ispaustas, stop mygtuko net paspausti neiseina.

Situ atveju man veikia tik ctrl+c terminale. po vienos tokios kombinacijos pertraukiama programa, taciau vartotojo interfeisas dar neisjungiamas. Kaip kazka panasaus realizuoti su stop mygtuku?

S
  • 26 Bal '10

Sveiki, turiu klausimeli, ko gero, adresuota sirex. programuodamas su pythonu rasau funkcija kuri man pasako kuris elementas yra isrinktas is lenteles mano GUI. ta funkcija atrodo taip:

sel = self.StatsView.get_selection()
(model,iter)=sel.get_selected()
if iter == None:
print "no row selected"
else :
print list(model[iter])

Viskas veikia, o print list(model[iter]) isveda visa pasirinkta eilute, sudaryta is daug stulpeliu. pavyzdziui ['00:21:FE:C5:82:A3', '2010-04-26 12:27:51', 'file.jpg', '32887', '9', 'Sent', 'Nokia', '0:00:03', '10962.33']. Kaip ir gaunu ko man reikia, taciau kaip is sito listo pasiimti tik adresa t.y. tik 00:21:FE:C5:82:A3? kiek zinau listai neturi tokio atributo kaip split, todel jo cia neiseina naudoti.. Aciu uz pagelbejima.

S
  • 26 Bal '10

list tipas yra paprasčiausias neasociatyvus masyvas, kurio elementai sunumeruoti nuo nulio ir pasiekiami taip:

>>> mylist = list('abc')
... mylist[2]
'c'