Python multiple window application

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

Python multiple window application

OdgovorNapisal/-a Saso » 07 Nov 2021, 12:35

V Paythonu s Tkinterjem poskušam naredit eno aplikacijo z multiple winow, pa mi malo nagaja tole.

Se pravi imamo main window, na katerem je gumb , ki odpre novo okno in skrije main window. -> to deluje
Na novem oknu je tudi gumb, ki naj bi zapru to novo okno in nazaj prikazal glavno okno. -> to deluje na pol.

Glavno okno se prikaže, noče pa zapreti novega okna in javi spodnjo napako?
Vrstica, na katero se napaka nanaša je odebeljena.

def mfs(self):
root.deiconify()
newwin.withdraw()

Kaka ideja kako tole spravit v pravilno delovanje?

newwin.withdraw()
NameError: name 'newwin' is not defined

Koda: Izberi vse
from tkinter import *
 
class Frames(object):
    def newFrame(self):
        newwin = Toplevel(root)
        newwin.title('New Window')
        newwin.geometry("200x100")
        newwin.resizable(0, 0)
   
        display = Label(newwin, text="Hello, " + self.query.get()) #getting parameter via query var
        display.pack()

        button2 =Button(newwin, text ="Open and Send New Window", command = self.mfs)
        button2.place(x = 15, y = 25, width=170, height=25)

        root.withdraw()
 
    def mainFrame(self,root):
        self.query = StringVar() #passing parameter via query var
       
        root.title('Open Window!!!')
        root.geometry("200x200")
        root.resizable(0, 0)
        button1 =Button(root, text ="Open and Send New Window", command =self.newFrame)
        button1.place(x = 15, y = 25, width=170, height=25)
 
        entry1 = Entry(root, textvariable=self.query)
        entry1.place(x = 50, y = 75, width=100, height=25)
   
    def mfs(self):
        root.deiconify()
        newwin.withdraw()
   

root = Tk()
app = Frames()
app.mainFrame(root)
root.mainloop()
_______________
LP
Sašo
Uporabniški avatar
Saso
 
Prispevkov: 1224
Pridružen: 18 Jan 2015, 19:41
Kraj: Trbovlje
Zahvalil se je: 169 krat
Prejel zahvalo: 269 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 56

Re: Python multiple window application

OdgovorNapisal/-a tilz0R » 07 Nov 2021, 12:59

Idealno vprasanje za stackoverflow.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 2371
Pridružen: 17 Jan 2015, 23:12
Kraj: Črnomelj
Zahvalil se je: 262 krat
Prejel zahvalo: 762 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: Python multiple window application

OdgovorNapisal/-a zanka » 07 Nov 2021, 13:41

preimenuj newwin v self.newwin, da bo spremenljivka vidna med funkcijami
Uporabniški avatar
zanka
 
Prispevkov: 3733
Pridružen: 17 Mar 2016, 00:16
Kraj: SI-8000
Zahvalil se je: 138 krat
Prejel zahvalo: 502 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 98

Re: Python multiple window application

OdgovorNapisal/-a booxco » 07 Nov 2021, 15:19

Prenest moraš ime newwin v funkcijo mfs. Lahko preko self, ali pa eksplicitno:

Koda: Izberi vse
button2 =Button(newwin, text ="Open and Send New Window", command = lambda: self.mfs(newwin))


in seveda:

Koda: Izberi vse
def mfs(self, newwin):
booxco
 
Prispevkov: 219
Pridružen: 25 Sep 2016, 21:17
Kraj: Lj okolica
Zahvalil se je: 42 krat
Prejel zahvalo: 95 krat
Uporabnika povabil: radix
Število neizkoriščenih povabil: 19

Re: Python multiple window application

OdgovorNapisal/-a Saso » 07 Nov 2021, 15:25

booxco je napisal/-a:Prenest moraš ime newwin v funkcijo mfs. Lahko preko self, ali pa eksplicitno:

Koda: Izberi vse
button2 =Button(newwin, text ="Open and Send New Window", command = lambda: self.mfs(newwin))


in seveda:

Koda: Izberi vse
def mfs(self, newwin):


Tole pa sedaj deluje :).
Hvala.

Lahko mogoče še malo bolj opišeše kdo tole lambda: pri command.
_______________
LP
Sašo
Uporabniški avatar
Saso
 
Prispevkov: 1224
Pridružen: 18 Jan 2015, 19:41
Kraj: Trbovlje
Zahvalil se je: 169 krat
Prejel zahvalo: 269 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 56

Re: Python multiple window application

OdgovorNapisal/-a booxco » 07 Nov 2021, 15:44

Lambda je krajši zapis za enovrstično definicijo anonimne funkcije.

Koda: Izberi vse
def sestej(x, y):
    return x + y


lahko skrajšaš v

Koda: Izberi vse
sestej = lambda x, y: x + y



V tvojem primeru bi torej na dolgo naredil takole:

Koda: Izberi vse
def zapri():
     self.mfs(newwin)
button2 =Button(newwin, text ="Open and Send New Window", command = zapri)


Kadar pa je funkcija kratka in ne potrebuješ imena (jo na primer uporabiš le enkrat), lahko uporabiš lambdo.

Kot je že nekdo zgoraj omenil, bi lahko newwin tudi opremil s "self." in ga s tem naredil vidnega znotraj celega objekta in s tem tudi znotraj mfs. Sedaj je pač definiran samo znotraj newframe funckije. Moj predlog ga v mfs spravi prek argumenta, ni pa to edina možnost.
booxco
 
Prispevkov: 219
Pridružen: 25 Sep 2016, 21:17
Kraj: Lj okolica
Zahvalil se je: 42 krat
Prejel zahvalo: 95 krat
Uporabnika povabil: radix
Število neizkoriščenih povabil: 19


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost