Pereiti prie turinio

Python TkInter klausimas


Rekomenduojami pranešimai

Sveiki. Susidūriau su problema darydamas programą. Taigi, naudoju TkInter kurdamas GUI. Noriu, kad paspaudus mygtuką pasikeistų langas (ta prasme dingtų visi widgets ir atsirastų kiti), tačiau niekaip nepavyksta.

 

Bandžiau daryti taip, tačiau nepavyksta, nes išsijungia visa programa:

 

#!/usr/bin/env python
# coding=utf-8

from Tkinter import *

root = Tk()
frame = Frame(root, width=220)
frame.pack()

def callback(number):
   print "Paspaude", number

def prideti():
   root.destroy()

class pagrindinis():
btn_dict = {}
lines = tuple(open("db.txt", 'r'))
for line in lines:
	line = line[:-1]
	action = lambda x = line: callback(x)
	btn_dict[line] = Button(root, text=line, command=action, width=20)
	btn_dict[line].pack(pady=3)


btnExit = Button(root, text="Exit", command=quit, width=5)
btnExit.pack(side=RIGHT, padx=10, pady=(10,5))
btnAdd = Button(root, text="Pridėti", command=prideti, width=5)
btnAdd.pack(side=LEFT, padx=10, pady=(10,5))



root.mainloop()

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Klasė nėra tas pats, kas funkcija :) Nors su Tk nedirbu, tu, berods sunaikini visą savo aplikaciją (Tk instance). O taip pat – nežinau, kas tavo faile.

 

Ten tiesiog skaičiai nuo 1 iki 4, kad išvestų juos į cmd kai paspaudi mygtuką.

 

O gal geriau naudoti ką nors kito, vietoj TkInter?

Redagavo leechMaster
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nu, perdariau ant wxPython dabar viską. Štai kas gavosi:

 

#!/usr/bin/python
# coding: utf-8

import wx


class Example(wx.Frame):

   def __init__(self, *args, **kw):
       super(Example, self).__init__(*args, **kw) 

       self.InitUI()

   def InitUI(self):   

       pnl = wx.Panel(self)

       btn_dict = {}
       lines = tuple(open("db.txt", 'r'))
       sk = 0

       for line in lines:
           line = line[:-1]
           h = 30 + 30 * sk
           btn_dict[line] = wx.Button(pnl, label=line, pos=(75, h), size=(100, 25))
           btn_dict[line].Bind(wx.EVT_BUTTON, self.OnClick(line))
           sk += 1

       cbtn = wx.Button(pnl, label='Close', pos=(10, 5))
       cbtn.Bind(wx.EVT_BUTTON, self.OnClose)

       self.SetSize((250, 200))
       self.SetTitle('xXx')
       self.Centre()
       self.Show(True)          

   def OnClose(self, e):
       self.Close(True)    

   def OnClick(self, txt):
       print "Paspaude", txt


def main():

   ex = wx.App()
   Example(None)
   ex.MainLoop()    


if __name__ == '__main__':
   main()   

 

Tačiau iškilo viena problema. Įjungus programą iš karto parodo, kad visi mygtukai buvo paspausti ir daugiau jų spausti neina.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nu, perdariau ant wxPython dabar viską. Štai kas gavosi:

 

Tačiau iškilo viena problema. Įjungus programą iš karto parodo, kad visi mygtukai buvo paspausti ir daugiau jų spausti neina.

 

self.OnClick(line)

Tai yra metodo iškvietimas. Tu nenori kviesti metodo, tik perduoti jį kaip callbacką. Turėtų būti

self.OnClick

Nuoroda į pranešimą
Dalintis kituose puslapiuose

self.OnClick(line)

Tai yra metodo iškvietimas. Tu nenori kviesti metodo, tik perduoti jį kaip callbacką. Turėtų būti

self.OnClick

 

Bet man reikia gauti reikšmę, kuris mygtukas buvo paspaustas, o mygtukai kuriami dinamiškai.

Redagavo leechMaster
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Bet man reikia gauti reikšmę, kuris mygtukas buvo paspaustas, o mygtukai kuriami dinamiškai.

Tu gauni Event objektą į savo OnClick. Pats Wx nenaudoju, bet jame turėtų būt kokia nors nuoroda į objektą. Kiek išsigooglinau, berods

e.GetEventObject()

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tu gauni Event objektą į savo OnClick. Pats Wx nenaudoju, bet jame turėtų būt kokia nors nuoroda į objektą. Kiek išsigooglinau, berods

e.GetEventObject()

 

Bandžiau jau su šituo, tačiau paspaudus parašo

<wx._controls.Button; proxy of <Swig Object of type 'wxButton *' at 0x1928408> >

 

EDIT: Pavyko su GetEventObject().GetLabel(). Dėkui už pagalbą ;D

Redagavo leechMaster
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na ką, priėjau vėl prie tos pačios problemos, tik dabar su wxPython... Niekaip neina išvalyti lango.

 

#!/usr/bin/python
# coding: utf-8

import wx


class Pagrindinis(wx.Frame):

   def __init__(self, *args, **kw):
       super(Pagrindinis, self).__init__(*args, **kw) 

       self.InitUI()

   def InitUI(self):   

       pnl = wx.Panel(self)

       btn_dict = {}
       lines = tuple(open("db.txt", 'r'))
       sk = 0

       for line in lines:
           line = line[:-1]
           h = 5 + 30 * sk
           btn_dict[line] = wx.Button(pnl, label=line, name=line, pos=(75, h), size=(100, 25))
           btn_dict[line].Bind(wx.EVT_BUTTON, self.OnClick)
           sk += 1

       h += 32
       abtn = wx.Button(pnl, label='Pridėti', pos=(10, h), size=(80, 25))
       abtn.Bind(wx.EVT_BUTTON, self.OnAdd)
       cbtn = wx.Button(pnl, label='Uždaryti', pos=(144, h), size=(80, 25))
       cbtn.Bind(wx.EVT_BUTTON, self.OnClose)


       self.SetSize((250, 200))
       self.SetTitle('xXx')
       self.Centre()
       self.Show(True)          

   def OnClose(self, e):
       self.Close(True)    

   def OnClick(self, event):
       eventas = event.GetEventObject().GetLabel()
       self.SetTitle(eventas)

   def OnAdd(self, e):
       self.Show(False)


def main():

   ex = wx.App()
   Pagrindinis(None)
   ex.MainLoop() 


if __name__ == '__main__':
   main()   

 

Bandau su self.Show(False) ir self.destroy(), bet abu išjungia visą programą.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na ką, priėjau vėl prie tos pačios problemos, tik dabar su wxPython... Niekaip neina išvalyti lango.

 

#!/usr/bin/python
# coding: utf-8

import wx


class Pagrindinis(wx.Frame):

   def __init__(self, *args, **kw):
       super(Pagrindinis, self).__init__(*args, **kw) 

       self.InitUI()

   def InitUI(self):   

       pnl = wx.Panel(self)

       btn_dict = {}
       lines = tuple(open("db.txt", 'r'))
       sk = 0

       for line in lines:
           line = line[:-1]
           h = 5 + 30 * sk
           btn_dict[line] = wx.Button(pnl, label=line, name=line, pos=(75, h), size=(100, 25))
           btn_dict[line].Bind(wx.EVT_BUTTON, self.OnClick)
           sk += 1

       h += 32
       abtn = wx.Button(pnl, label='Pridėti', pos=(10, h), size=(80, 25))
       abtn.Bind(wx.EVT_BUTTON, self.OnAdd)
       cbtn = wx.Button(pnl, label='Uždaryti', pos=(144, h), size=(80, 25))
       cbtn.Bind(wx.EVT_BUTTON, self.OnClose)


       self.SetSize((250, 200))
       self.SetTitle('xXx')
       self.Centre()
       self.Show(True)          

   def OnClose(self, e):
       self.Close(True)    

   def OnClick(self, event):
       eventas = event.GetEventObject().GetLabel()
       self.SetTitle(eventas)

   def OnAdd(self, e):
       self.Show(False)


def main():

   ex = wx.App()
   Pagrindinis(None)
   ex.MainLoop() 


if __name__ == '__main__':
   main()   

 

Bandau su self.Show(False) ir self.destroy(), bet abu išjungia visą programą.

 

Perdaryk taip:

 

self.pnl = wx.Panel(self)

 

Ir tada toje vietoje, kur nori, kad išsivalytų panelė, rašai taip:

 

self.pnl.Destroy()
self.pnl = wx.Panel(self)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...