etse Skrevet 29. mai 2010 Del Skrevet 29. mai 2010 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
snippsat Skrevet 29. mai 2010 Del Skrevet 29. mai 2010 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?. Lenke til kommentar
etse Skrevet 29. mai 2010 Forfatter Del Skrevet 29. mai 2010 (endret) 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 29. mai 2010 av etse Lenke til kommentar
etse Skrevet 30. mai 2010 Forfatter Del Skrevet 30. mai 2010 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
Kaptein Snus Skrevet 31. mai 2010 Del Skrevet 31. mai 2010 (endret) 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 Endret 31. mai 2010 av Lek1 Lenke til kommentar
snippsat Skrevet 2. juni 2010 Del Skrevet 2. juni 2010 (endret) 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 2. juni 2010 av SNIPPSAT Lenke til kommentar
etse Skrevet 3. juni 2010 Forfatter Del Skrevet 3. juni 2010 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
Skinney Skrevet 6. juni 2010 Del Skrevet 6. juni 2010 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 Lenke til kommentar
etse Skrevet 6. juni 2010 Forfatter Del Skrevet 6. juni 2010 (endret) 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 6. juni 2010 av etse Lenke til kommentar
etse Skrevet 7. juni 2010 Forfatter Del Skrevet 7. juni 2010 liten feil. funket å sette parent til frame og ikke panel. merkelig det funket slik den var i windows. anyway, problem løst. Får ikke satt tråden til løst med knappen =/ Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå