Functie aanroepen vanuit ander Python bestand

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • HornyWolf
  • Registratie: Maart 2008
  • Laatst online: 26-08 12:49
Mijn vraag
Hallo allemaal,

Sinds kort speel ik wat met Python (noob/newbie/groentje dus). Ik loop echter tegen het volgende probleem aan. Vanuit de GUI in a.py roep ik een functie aan in b.py aan. Hiervoor sluit ik eerst de GUI van a.py en maak een nieuwe GUI vanuit b.py. Als ik klaar ben met b.py, sluit ik de GUI van b.py en wil ik weer terug naar de GUI in a.py.

In a.py staat de regel:
from b.py import bgui
zodat a.py deze functie kan vinden.

So far so good. Maar als ik stop met de functie bgui, wil ik na het sluiten van bgui, opnieuw de GUI van a.py (functie agui) aanroepen/starten. Python meldt echter dat agui niet gevonden kan worden. De logische oplossing leek me om in b.py de functie van a.py te importeren, oftewel:
from a.py import agui
De .py-bestanden staan allebeide in dezelfde directory.

Helaas geeft Python dan ineens de melding dat b.gui niet kan worden gevonden. Toen zakte me de broek enigszins af. Als ik in b.py vertel dat functie agui in a.py staat, zegt a.py dat ie de functie bgui in b.py ineens niet meer kan vinden?
Hier snap ik helemaal niets van (maar ja, zoals gezegd ben ik op Python gebied nog een een noob :) ). Weet iemand wat ik fout en/of hoe ik dit kan oplossen?

Groetjes, Hein de Vries

Relevante software en hardware die ik gebruik
Standaard pc met Win10 en Python 3. Voor de GUI gebruik ik tkinter.

Wat ik al gevonden of geprobeerd heb
Diverse vormen van importen en/of functie-aanroepen, maar niets werkt helaas.

Beste antwoord (via HornyWolf op 28-12-2019 15:12)


  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

HornyWolf schreef op vrijdag 27 december 2019 @ 18:08:
@Evanescent/@Verwijderd Volgens mij haal ik dit niet door mekaar (zei de noob). Dus hier wat (ingekorte) code om de boel te verduidelijken:

inhoud a.py
from b import bgui
... # nog enkele import statements zoals tkinter en zo
def ganaarbgui():
agui.destroy() # sluit venster agui
bgui()
def agui():
agui = Tk()
abutton = Button(agui, text = "Ga naar B", command = partial(ganaarbgui) )

agui()


inhoud b.py
from a import agui
... # nog enkele import statements zoals tkinter en zo
def ganaaragui():
bgui.destroy() #sluit venster bgui
agui()
def bgui():
bgui = Tk()
bbutton = Button(bgui, text = "Ga terug naar A", command = partial(ganaaragui) )

Als ik bij b.py het statement "from a import agui" weglaat, dan krijg ik pas foutmeldingen als ik in bgui op de knop "Terug naar A" aanklik. Vanuit a.py kan ik prima naar bgui in b.py.
Maar vanuit bgui/b.py terug naar agui/a.py wil natuurlijk niet want ik heb in b.py niet aangegeven waar Python agui kan vinden.

Als ik bij b.py het statement "from a import agui" plaats, dan krijg ik bij het starten direct de foutmelding dat bgui(!) niet gevonden is (bgui, niet agui).

Simpel geformuleerd: als ik wat aanpas in B, zegt A ineens dat ie B niet meer kan vinden.

Hopelijk heb ik het iets duidelijker kunnen maken. Alle tips zijn welkom.

Groetjes, Hein

Edit: ik zie dat de code zonder indentation/tabs is geplaatst. Deze staan natuurlijk wel in mijn scripts.
Moeilijk te zien zonder indent, maar start je je script doormiddel van a.py? Dan is het logisch, er gebeurt het volgende:
1) Python laadt a.py, begint bovenaan.
2) Laadt b.py, want import, begint daar bovenaan.
3) Ziet daar weer een import voor a, dus begint daar weer mee.
4) Start met a en ziet de import voor b, maar dat heeft hij al gedaan! Dus skipt hij dat.
5) Gaat door in a, voert agui() uit, maar zoals je hierboven leest wordt bgui() dus nooit ingelezen en daar is je error..

Paar dingen om je in te verdiepen:
- Zogenaamde circulaire afhankelijkheden zijn vaak onhandig (a heeft b nodig die weer a nodig heeft). Leesvoer: https://stackabuse.com/python-circular-imports/
- Om voor nu te voorkomen dat de import van a door b agui() gaat uitvoeren; doe het volgende onderaan a ipv direct agui() aanroepen:
code:
1
2
if __name__ == "__main__":
  agui()

Dit zorgt ervoor dat in de eerste load van a.py wél agui() wordt aangeroepen aan het eind, maar NIET bij de import van stap 3 hierboven. Meer info: https://stackoverflow.com...what-does-if-name-main-do

Alle reacties


Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
@HornyWolf Haal je niet bgui en b.gui door elkaar? :? Anders zou enkele relevante code wel handig zijn.

offtopic:
PS: Ken je deze? oOo

[ Voor 32% gewijzigd door Room42 op 27-12-2019 16:03 ]

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

  • HornyWolf
  • Registratie: Maart 2008
  • Laatst online: 26-08 12:49
@Evanescent/@Verwijderd Volgens mij haal ik dit niet door mekaar (zei de noob). Dus hier wat (ingekorte) code om de boel te verduidelijken:

inhoud a.py
from b import bgui
... # nog enkele import statements zoals tkinter en zo
def ganaarbgui():
agui.destroy() # sluit venster agui
bgui()
def agui():
agui = Tk()
abutton = Button(agui, text = "Ga naar B", command = partial(ganaarbgui) )

agui()


inhoud b.py
from a import agui
... # nog enkele import statements zoals tkinter en zo
def ganaaragui():
bgui.destroy() #sluit venster bgui
agui()
def bgui():
bgui = Tk()
bbutton = Button(bgui, text = "Ga terug naar A", command = partial(ganaaragui) )

Als ik bij b.py het statement "from a import agui" weglaat, dan krijg ik pas foutmeldingen als ik in bgui op de knop "Terug naar A" aanklik. Vanuit a.py kan ik prima naar bgui in b.py.
Maar vanuit bgui/b.py terug naar agui/a.py wil natuurlijk niet want ik heb in b.py niet aangegeven waar Python agui kan vinden.

Als ik bij b.py het statement "from a import agui" plaats, dan krijg ik bij het starten direct de foutmelding dat bgui(!) niet gevonden is (bgui, niet agui).

Simpel geformuleerd: als ik wat aanpas in B, zegt A ineens dat ie B niet meer kan vinden.

Hopelijk heb ik het iets duidelijker kunnen maken. Alle tips zijn welkom.

Groetjes, Hein

Edit: ik zie dat de code zonder indentation/tabs is geplaatst. Deze staan natuurlijk wel in mijn scripts.

[ Voor 3% gewijzigd door HornyWolf op 27-12-2019 18:10 . Reden: Code wordt niet goed weergegeven ]


Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
@HornyWolf Je kunt de code tussen [code=python] en [/]-tags plaatsen.

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

HornyWolf schreef op vrijdag 27 december 2019 @ 18:08:
@Evanescent/@Verwijderd Volgens mij haal ik dit niet door mekaar (zei de noob). Dus hier wat (ingekorte) code om de boel te verduidelijken:

inhoud a.py
from b import bgui
... # nog enkele import statements zoals tkinter en zo
def ganaarbgui():
agui.destroy() # sluit venster agui
bgui()
def agui():
agui = Tk()
abutton = Button(agui, text = "Ga naar B", command = partial(ganaarbgui) )

agui()


inhoud b.py
from a import agui
... # nog enkele import statements zoals tkinter en zo
def ganaaragui():
bgui.destroy() #sluit venster bgui
agui()
def bgui():
bgui = Tk()
bbutton = Button(bgui, text = "Ga terug naar A", command = partial(ganaaragui) )

Als ik bij b.py het statement "from a import agui" weglaat, dan krijg ik pas foutmeldingen als ik in bgui op de knop "Terug naar A" aanklik. Vanuit a.py kan ik prima naar bgui in b.py.
Maar vanuit bgui/b.py terug naar agui/a.py wil natuurlijk niet want ik heb in b.py niet aangegeven waar Python agui kan vinden.

Als ik bij b.py het statement "from a import agui" plaats, dan krijg ik bij het starten direct de foutmelding dat bgui(!) niet gevonden is (bgui, niet agui).

Simpel geformuleerd: als ik wat aanpas in B, zegt A ineens dat ie B niet meer kan vinden.

Hopelijk heb ik het iets duidelijker kunnen maken. Alle tips zijn welkom.

Groetjes, Hein

Edit: ik zie dat de code zonder indentation/tabs is geplaatst. Deze staan natuurlijk wel in mijn scripts.
Moeilijk te zien zonder indent, maar start je je script doormiddel van a.py? Dan is het logisch, er gebeurt het volgende:
1) Python laadt a.py, begint bovenaan.
2) Laadt b.py, want import, begint daar bovenaan.
3) Ziet daar weer een import voor a, dus begint daar weer mee.
4) Start met a en ziet de import voor b, maar dat heeft hij al gedaan! Dus skipt hij dat.
5) Gaat door in a, voert agui() uit, maar zoals je hierboven leest wordt bgui() dus nooit ingelezen en daar is je error..

Paar dingen om je in te verdiepen:
- Zogenaamde circulaire afhankelijkheden zijn vaak onhandig (a heeft b nodig die weer a nodig heeft). Leesvoer: https://stackabuse.com/python-circular-imports/
- Om voor nu te voorkomen dat de import van a door b agui() gaat uitvoeren; doe het volgende onderaan a ipv direct agui() aanroepen:
code:
1
2
if __name__ == "__main__":
  agui()

Dit zorgt ervoor dat in de eerste load van a.py wél agui() wordt aangeroepen aan het eind, maar NIET bij de import van stap 3 hierboven. Meer info: https://stackoverflow.com...what-does-if-name-main-do

Acties:
  • +1 Henk 'm!

  • Ben(V)
  • Registratie: December 2013
  • Laatst online: 18:37
Maakt een main programma.
Importeer a en b
Roep a aan ( die komt na afloop gewoon weer terug in main )
Roep b aan.

Als je dat wilt door laten gaan maak een je loop rond die twee aanroepen.

PS Misschien handig om eerst de basis beginselen van programmeren te bestuderen

All truth passes through three stages: First it is ridiculed, second it is violently opposed and third it is accepted as being self-evident.


Acties:
  • 0 Henk 'm!

  • HornyWolf
  • Registratie: Maart 2008
  • Laatst online: 26-08 12:49
Bedankt voor alle reacties.
Pagina: 1