slacky Skrevet 18. januar 2012 Del Skrevet 18. januar 2012 (endret) Hesann. Lager et enkelt program i python som skal importere og kjøre scriptene mine, etter jeg har redigert scriptet, og forsøker å kjøre scriptet IGJEN så bruker den ikke oppdaterte kode.. Noen som ser en bedre/annen fremgangsmåte? Tenker meg at den bare kjører filen som er blitt kompilert/.pyc-filen fra første "run"? PS: Har ikke jobbet med denne lenge, så det er stort sett bare "run", og tilhørende textfelt (valg av fil) som fungerer. Krav er WxPython, og et script plasert i mappen som blir spesifisert, om du skal "teste" deg frem. Delkode: def Run(self,event): Exec = self.ExecI.GetValue() Wind = self.WindI.GetValue() #ikke implementert, tilhører macrosaker. if(Exec!="" or Exec!=0): try: macro = __import__(Exec) macro._run() except ImportError: print "Unable to import file %s.py" % (Exec) Hele kildekoden: #!/usr/bin/python # -*- coding: utf-8 -*- ''' MacPy skal bli en enkel GPL macroengine for python, fuksjoner som finnes er bare grunleggende: Musebevegelser, fargenavigasjon, arbeidsvindu. En del halvferdige saker uten om dette. Inkluderes seperat i macroen. ''' #from time import sleep as wait #re,subprocess #import wx.lib.buttons as buttons import wx,sys sys.path.append("Bots/") #mappen filen ligger i. class MacPy(wx.Frame): def __init__(self, parent,id): wx.Frame.__init__(self, parent, id, "MacPy - v0.1", size=(540,280)) self.MakeMenu() self.Worker() def Worker(self): panel = wx.Panel(self) panel.SetBackgroundColour('#eeeff2') hbox = wx.BoxSizer(wx.HORIZONTAL) fgs = wx.FlexGridSizer(6, 2, 9, 25) Exec = wx.StaticText(panel, label="Execute bot - Filename:") Wind = wx.StaticText(panel, label="Window: *Empty if not used*") self.ExecI = wx.TextCtrl(panel, size=(250,21)) self.WindI = wx.TextCtrl(panel, size=(250,21)) Run = wx.Button(panel, label="Run") Run.Bind(wx.EVT_BUTTON, self.Run) debugbox = wx.StaticBox(panel, label="Debug") boxsizer = wx.StaticBoxSizer(debugbox, wx.VERTICAL) dbgtext = wx.TextCtrl(panel, style=wx.TE_MULTILINE, size=(540,100)) boxsizer.Add(dbgtext, flag=wx.EXPAND, border=9) fgs.AddMany([(Exec, 1), (self.ExecI, 1), (Wind, 1), (self.WindI, 1), (Run, 1), (boxsizer, 1, wx.EXPAND)]) fgs.AddGrowableRow(6, 1) fgs.AddGrowableCol(1, 1) hbox.Add(fgs, proportion=1, flag=wx.ALL|wx.EXPAND, border=8) panel.SetSizer(hbox) def Run(self,event): Exec = self.ExecI.GetValue() Wind = self.WindI.GetValue() if(Exec!="" or Exec!=0): try: macro = __import__(Exec) macro._run() except ImportError: print "Unable to import file %s.py" % (Exec) def MakeMenu(self): status=self.CreateStatusBar() menubar=wx.MenuBar() file=wx.Menu() script=wx.Menu() about=wx.Menu() file.Append(wx.NewId(), "Open project...","Open a PyMac-project") file.Append(wx.NewId(), "Quit","Exit this program") about.Append(wx.NewId(), "MacPy","About the MacPy-software") script.Append(wx.NewId(), "Run","Run script...") script.Append(wx.NewId(), "Pause","Pause script...") script.Append(wx.NewId(), "Stop","Stop script...") menubar.Append(file, "File") menubar.Append(script, "Script") menubar.Append(about, "About") self.SetMenuBar(menubar) # Run the program if __name__ == "__main__": app = wx.PySimpleApp() frame = MacPy(parent=None,id=-1) frame.Show() #frame.Centre() app.MainLoop() Det kan vel kansje være mulig å slette kompilert fil etter "run", på den måten blir den tvungen til å kompilere igjen? Endret 24. februar 2012 av warpie Lenke til kommentar
snippsat Skrevet 18. januar 2012 Del Skrevet 18. januar 2012 (endret) og forsøker å kjøre scriptet IGJEN så bruker den oppdaterte kode Regner med at "ikke" skal være med i den setningen >>> help(reload) Help on built-in function reload in module __builtin__: reload(...) reload(module) -> module Reload the module. The module must have been successfully imported before. Test reload. def Run(self,event): Exec = self.ExecI.GetValue() Wind = self.WindI.GetValue() if(Exec!="" or Exec!=0): try: macro = __import__(Exec) reload(macro) macro.main() except ImportError: print "Unable to import file %s.py" % (Exec) Min test fil. #h.py def main(): print 'I am runnig' print 'a change 1 2' if __name__ == '__main__': main() Med dette kan jeg ha GUI kjørende og viss jeg gjør forandinger på h.py og lagrer. Vil knapp run() få med de nye endringene uten restart av GUI. Du kan lage en egen reload button for dette. Endret 18. januar 2012 av SNIPPSAT Lenke til kommentar
slacky Skrevet 18. januar 2012 Forfatter Del Skrevet 18. januar 2012 (endret) Beklager skrivefeilen. Flott du forstod det uansett Tenker dette fungerer, og skal testes ut. Du vet ikke om noen måte for at en gui skal kunne kjøre en loop uten å "låses"? Jeg får opp Not responding så lenge macroen/scriptet kjøres. Mister muligheten for å stoppe programmet, pause, etc... Har googlet på dette, men det var ikke så mye å finne. Litt vanskelig når man ikke helt vet hva man skal søke etter, fant noe om threading, men forstår ikke helt hvordan dette ta's i bruk... Endret 24. februar 2012 av warpie Lenke til kommentar
Gjest Slettet+9871234 Skrevet 18. januar 2012 Del Skrevet 18. januar 2012 Der er jo også god hjelp i Python dokumentasjonen, både på nettet og på hjelp funksjonaliteten som følger med programmet. Har du prøvd der? Lenke til kommentar
Yumekui Skrevet 18. januar 2012 Del Skrevet 18. januar 2012 Du vet ikke om noen måte for at en gui skal kunne kjøre en loop uten å "låses"? Jeg får opp Not responding så lenge macroen/scriptet kjøres. Da er poenget med en gui bortkastet.. Mister muligheten for å stoppe programmet, pause, etc... Har googlet på dette, men det var ikke så mye å finne. Litt vanskelig når man ikke helt vet hva man skal søke etter.. Jeg tror det her noe å gjøre med at GUI applikasjoner etc er looper som venter på events selv, fikk det forsøkt forklart i #Python @ irc.freenode.net, men forstod ikke noe særlig av det. Kanskje du kan forsøke å spørre der? Lenke til kommentar
snippsat Skrevet 19. januar 2012 Del Skrevet 19. januar 2012 Du vet ikke om noen måte for at en gui skal kunne kjøre en loop uten å "låses"? Det er stort sett 2 grunner til dette. Man kjører med IDE i bakgrunnen dette kan være python sitt default eller eget IDE man bruker. En løsning er og kjøre koden fra command line. For windows bruker Pyscripter i dette IDE kan man kjøre noe som heter remote wx. Dette gjør at GUI ikke låser seg. Den andre grunnen til lås av GUI er at man kjører en prosess som tar litt tid. Dette kan da løses med Threading eller multiprocessing Mike Driscol har en bra post om threading i wxpython her. http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/ Når jeg tester koden din så låser ikke GUI seg for meg. 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å