Gå til innhold

[python] Socket + WxPython prolem


Anbefalte innlegg

Jeg sitter for tiden og prøver å lære meg litt bruken av socket og det å sette opp GUI i python ved bruk av wxPython boblioteket. Tanken var da og laget en utrolig enkel IRC-klient da dette åpner opp for begge deler. Jeg er enda helt nybegynner på disse tingene og trenger aboslutt lære mer. Så om noen har gode tips til plasser å lære mer om wxPython spesielt taes det i mot med stor glede :)

 

Jeg bemerker at jeg enda ikke har implementert sizers, og tenkte å gjøre det så fort jeg faktisk får det til å fungere til en grad jeg kan akseptere.

 

Koden: http://pastebin.com/f4y6edF6

 

problemet er at selve interfacet fryser så fort jeg kobler meg til serveren, og det ser ut til å være pga jeg prøver å kjøre metoden IRC.recieve. Jeg mottar data og får skrevet det ut i tekstboksen, men vinduet låser seg helt. Programmet svarer og på eventuelle Ping-forespørsler om jeg bare lar det være i fred og ikke prøver trykke på interfacet (noe som medfører at programmet ikke svarer).

 

Jeg lurte derfor på om noen her hadde forslag til hvorfor. Mye av selve IRC-klient delen vil jeg ikke ta ære for selv. Da denne oden i stordel baserer seg på kode fra en "tutorial". Videre bruker jeg også en timer for å hele tiden be programmet sjekke bufferet for data som har kommet inn og behandle den - er dette er dårlig måte å gjøre dette på?

Lenke til kommentar
Videoannonse
Annonse

Du er ikke lurt og laste inlogging med gang du starter gui.

Altså ikke la innlogging ligge under __init__.

 

Få gui til og laste uten at noe innloggin skjer.

Lag textbokser for login/passord og en knapp for connect

Da kan du lage feilbehandling(exception handling) når du trykker på på connect.

 

Ikke helt det samme men du kan se på en mail program jeg lagde(wxpython) for gøy til sende gmail.

Viss noe feil skjer skriver jeg en feilmelding(StaticText),over hva som har skjedd enten om det er feil med logging eller når en skal sende mail.

 

Bruker ikke irc så får ikke testet med en bruker/passord som jeg vet virker.

Virker IRC-klient viss du tar bort gui?.

post-53555-1275113034,8719_thumb.png

post-53555-1275113094,8923_thumb.png

Lenke til kommentar

Takk for svar :) Prøvde å ta det litt videre og la ikke selve nettverket starte så fort GUI ble åpnet opp. Slik at det kunne få tid til å loade. og koden ble derfor og litt endret.

 

Du sier du ikke får ntestet med en bruker du vet virker, IRC krever ingen brukere. Kun at du oppgir noe informasjon i det du logger på - som programmet gjør. Og jeg får fint koblet til serveren og mottar informasjon osv. Det burde være fullt mulig å teste programmet.

 

Har nå lagt til en tekst-boks helt øverst i programmet med en connect knapp. Skriver inn nicket i tekst-boksen og trykker på connect knappen og programmet kobler til serveren. Men får samme problemet så fort jeg trykker på knappen, selve GUI-delen fryser, mens jeg ser det kommer opp informasjon fra serveren i tekstboksen som skriver ut informasjonen. Det kan virke som om det blir brukt alt for mye av tiden på selve nettverksdelen og det blir lite tid innimellom til styring av GUI-interfacet?

 

nytt utkast: http://pastebin.com/6qRk2tAr

Endret av etse
Lenke til kommentar

Jeg har nå satt meg ned og prøve å lære litt basic threading, selv om jeg ikke hadde tenkt å ta for meg den delen enda. Men når jeg kjører selve backbons til IRC-klienten i en egen tråd og lar gui være i fred i hovedtråden fungerer alt helt smertefritt.

 

For meg ser det derfor ut som om netverket tok for mye av "oppmerksomheten" vekk fra selve GUI-et. Er det noen som har forslag til hvordan jeg kunne løst dette uten å bruke threading?

Lenke til kommentar

Er ganske fersk på linux, så vet ikke om dette har noe av betydning, men får flere av denne feilmeldingen:

 

Traceback (most recent call last):
 File "irc.py", line 73, in onUpdate
   self.textbox.AppendText(self.irc.recieve())
 File "/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_controls.py", line 1850, in AppendText
   return _controls_.TextCtrl_AppendText(*args, **kwargs)
 File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
   return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 764-766: invalid data

 

edit: ser nå at det kanskje er noe feil med min installasjon av wxPython :p

Endret av Lek1
Lenke til kommentar

Har testet litt mere og problemet et nok at timer funksjon låser gui når det ikke leses mere fra irc.

Har bruket timer funksjon til et alarmclock program jeg lagde.

Da fungere det jo bra sikkert fordi klokken leses hele tiden.

 

Dette er visst ikke så uvanlig,det virker helt fint når enn kjører du det uten gui.

Men når man skal utføre/lese fra en lengere prosess vil gui låse seg.

 

Prøve og se på Thread modulen,denne artikklen forklarer det bra.

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

Endret av SNIPPSAT
Lenke til kommentar

Har testet litt mere og problemet et nok at timer funksjon låser gui når det ikke leses mere fra irc.

Har bruket timer funksjon til et alarmclock program jeg lagde.

Da fungere det jo bra sikkert fordi klokken leses hele tiden.

 

Dette er visst ikke så uvanlig,det virker helt fint når enn kjører du det uten gui.

Men når man skal utføre/lese fra en lengere prosess vil gui låse seg.

 

Prøve og se på Thread modulen,denne artikklen forklarer det bra.

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

Jeg får det helt til med threading, problemet er at threading er utenom pensum for oss i år egentlig - og jeg lurte derfor metoder for hvordan man ville be programmet lese inn fra socket uten å bruke threading. Eneste jeg kunne finne var timer som gjevnlig gjorde det. Men som du sier, så låste det GUI-et. Er det andre måten å f.eks. implementere det i mainloop?

 

Må jeg ty til polymorphisme og prøve å endre hvordna mainloopen er, ved å legge til socket-kommandoene på slutten?

Lenke til kommentar

Vil tro dette er fordi du benytter deg av blocking sockets... Altså når du sender eller mottar noe så vil koden stoppe helt til du er ferdig med å sende og/eller motta. Ta en titt på asyncore eller asynchat modulen til python :)

Takker for informasjonen, jeg tror dette kan være grunnen og skal ta en titt på de modulene du nevnte =)

 

Videre har jeg støtt på enda et problem, nå noe som ser ut til å være kompabilitetsbasert. Jeg tok koden min som fungerte på windows-maskinen min og la den over på den andre maskinen som kjører ubuntu. På denne maskinen vil ikke "timeren" kjøres. Noen som vet hvordan få det til å fungere på ubuntu? Det kommer ikke opp noen feilmeldinger, men koden i timeren kjøres bare ikke =/

 

Koden er som følger (noe sakset, men får med det viktige):

class MainFrame(wx.Frame):
   def __init__(self, parent, id, title):
       wx.Frame.__init__(self, parent, id, title, size=(1080,720), pos=(100,100))
       panel = wx.Panel(self)

       # Timer with bind
       self.timer = wx.Timer(panel, wx.NewId())
       self.Bind(wx.EVT_TIMER, self.onTimer, self.timer)
       self.timer.Start(100)

   # Each timer event
   def onTimer(self, event):
       print "lol"

Endret av etse
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...