Übereinander Reihenfolge von Widgets

Fragen zu Tkinter.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Übereinander Reihenfolge von Widgets

Beitragvon Alfons Mittelmeyer » Montag 19. Juni 2017, 11:20

Kann man herausbekommen, wie widgets, die sich gegenseitig verdecken oder teilverdecken, übereinander angeordnet sind?
Benutzeravatar
wuf
User
Beiträge: 1319
Registriert: Sonntag 8. Juni 2003, 09:50

Re: Übereinander Reihenfolge von Widgets

Beitragvon wuf » Montag 19. Juni 2017, 14:13

Hi Alfons

Kannst du das folgende Snippet einmal ausprobieren?:
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. from functools import partial
  5.  
  6. try:
  7.     # Tkinter for Python 2.xx
  8.     import Tkinter as tk
  9. except ImportError:
  10.     # Tkinter for Python 3.xx
  11.     import tkinter as tk
  12.  
  13. APP_TITLE = "Lift lower frame to the top"
  14. APP_XPOS = 100
  15. APP_YPOS = 100
  16. APP_WIDTH = 300
  17. APP_HEIGHT = 200
  18.  
  19. FRAMES = 5
  20.  
  21. class Application(tk.Frame):
  22.  
  23.     def __init__(self, master):
  24.         self.master = master
  25.         tk.Frame.__init__(self, master)
  26.        
  27.         for index in range(FRAMES):
  28.             frame = tk.Frame(self, relief='raised', bd=1)
  29.             frame.place(x=20, y=20, width=100, height=100)
  30.             frame.name = "Frame: {}".format(index)
  31.             if index == 0:
  32.                 frame['bg'] = 'green'
  33.  
  34.         frame['bg'] = 'red'
  35.        
  36.         for child in self.winfo_children():    
  37.             print(child.winfo_class(), child.name, child)
  38.        
  39.         self.after(1000, self.lift_frame)
  40.        
  41.     def lift_frame(self):
  42.         frame = self.winfo_children()[0]
  43.         frame.lift()
  44.        
  45. def main():
  46.     app_win = tk.Tk()
  47.     app_win.title(APP_TITLE)
  48.     app_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
  49.     app_win.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
  50.    
  51.     app = Application(app_win).pack(fill='both', expand=True)
  52.    
  53.     app_win.mainloop()
  54.  
  55.  
  56. if __name__ == '__main__':
  57.     main()

Es liegen 5 Frames übereinander. Das oberste wird in rot angezeigt. Nach einer Sekunde wird das unterste grüne Frame nach oben gehievt.

Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Re: Übereinander Reihenfolge von Widgets

Beitragvon Alfons Mittelmeyer » Montag 19. Juni 2017, 15:35

wuf hat geschrieben:Hi Alfons
Kannst du das folgende Snippet einmal ausprobieren?:


Hi wuf, das hatte ich mir auch fast gedacht, aber noch nicht ausprobiert. Wie findest Du dieses Snippet:

  1. # -*- coding: utf-8 -*-
  2.  
  3. try:
  4.     import tkinter as tk
  5. except ImportError:
  6.     import Tkinter as tk
  7.  
  8.  
  9. # Application definition ============================
  10.  
  11. class Application(tk.Tk):
  12.  
  13.     def __init__(self,**kwargs):
  14.         tk.Tk.__init__(self,**kwargs)
  15.         self.minsize(215, 320)
  16.         # widget definitions ===================================
  17.         self.red = Red(self,name='red')
  18.         self.red.place(x='30', y='30')
  19.         self.yellow = Yellow(self,name='yellow')
  20.         self.yellow.place(x='60', y='60')
  21.         self.green = Green(self,name='green')
  22.         self.green.place(x='90', y='90')
  23.  
  24.         self.show_order()
  25.         self.after(5000,self.lift_order)
  26.  
  27.     def show_order(self):
  28.         for child in self.winfo_children():
  29.             print(child)
  30.         print('------------------------')
  31.  
  32.     def lift_order(self):
  33.         self.winfo_children()[0].lift()
  34.         self.show_order()
  35.         self.after(5000,self.lift_order)
  36.  
  37. class Green(tk.Frame):
  38.  
  39.     def __init__(self,master,**kwargs):
  40.         tk.Frame.__init__(self,master,**kwargs)
  41.         self.config(height=200, bg='lightgreen', relief='solid', width=100, bd=2)
  42.         # widget definitions ===================================
  43.         self.label = tk.Label(self,name='#3_label',bg='lightgreen', text='green')
  44.         self.label.place(x='3', y='3')
  45.  
  46. class Red(tk.Frame):
  47.  
  48.     def __init__(self,master,**kwargs):
  49.         tk.Frame.__init__(self,master,**kwargs)
  50.         self.config(height=200, bg='red', relief='solid', width=100, bd=2)
  51.         # widget definitions ===================================
  52.         self.label = tk.Label(self,name='#4_label',bg='red', text='red')
  53.         self.label.place(x='3', y='3')
  54.  
  55. class Yellow(tk.Frame):
  56.  
  57.     def __init__(self,master,**kwargs):
  58.         tk.Frame.__init__(self,master,**kwargs)
  59.         self.config(height=200, bg='yellow', relief='solid', width=100, bd=2)
  60.         # widget definitions ===================================
  61.         self.label = tk.Label(self,name='#5_label',bg='yellow', text='yellow')
  62.         self.label.place(x='3', y='3')
  63.  
  64. if __name__ == '__main__':
  65.     Application().mainloop()
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Beliebig einordnen

Beitragvon Alfons Mittelmeyer » Montag 19. Juni 2017, 17:58

Man kann natürlich Widgets auch beliebig platzieren. Hier habe ich widgets eins runter und widgets eins rauf.

Zuerst kommt rot um eins hoch, dann grün eins runter, dann gelb eins rauf und nochmals eins rauf

  1. # -*- coding: utf-8 -*-
  2.  
  3. try:
  4.     import tkinter as tk
  5. except ImportError:
  6.     import Tkinter as tk
  7.  
  8.  
  9. # Application definition ============================
  10.  
  11. class Application(tk.Tk):
  12.  
  13.     def __init__(self,**kwargs):
  14.         tk.Tk.__init__(self,**kwargs)
  15.         self.minsize(215, 320)
  16.         # widget definitions ===================================
  17.         self.red = Red(self,name='red')
  18.         self.red.place(x='30', y='30')
  19.         self.yellow = Yellow(self,name='yellow')
  20.         self.yellow.place(x='60', y='60')
  21.         self.green = Green(self,name='green')
  22.         self.green.place(x='90', y='90')
  23.  
  24.  
  25.         self.exe_list = [None,self.red.up,self.green.down,self.yellow.up,self.yellow.up]
  26.         self.exe_index = 0
  27.         self.exec_list()
  28.  
  29.     def exec_list(self):
  30.         if self.exe_index < len(self.exe_list):
  31.             if self.exe_list[self.exe_index]:
  32.                 self.exe_list[self.exe_index]()
  33.             self.exe_index += 1
  34.             self.after(5000,self.exec_list)
  35.  
  36. class StackWidget:
  37.  
  38.     def __init__(self,master):
  39.         self.master = master
  40.  
  41.  
  42.     def up(self):
  43.         children = self.master.winfo_children()
  44.         count = len(self.master.winfo_children())
  45.         index = children.index(self)
  46.                          
  47.         if count >= 2 and index != count-1:
  48.             # rotate to second top
  49.             while(self.master.winfo_children().index(self) != count-2):
  50.                 self.master.winfo_children()[0].lift()
  51.             #now one up
  52.             self.lift()
  53.            
  54.             #rotate until only one up
  55.             while(self.master.winfo_children().index(self) != index+1):
  56.                 self.master.winfo_children()[0].lift()
  57.                
  58.  
  59.     def down(self):
  60.         children = self.master.winfo_children()
  61.         count = len(self.master.winfo_children())
  62.         index = children.index(self)
  63.                          
  64.         if count >= 2 and index:
  65.             # rotate to second bottom
  66.  
  67.             while(self.master.winfo_children().index(self) != 1):
  68.                 self.master.winfo_children()[0].lift()
  69.             #now one lower
  70.             self.lower()
  71.            
  72.             # rotate until only one down
  73.             while(self.master.winfo_children().index(self) != index-1):
  74.                 self.master.winfo_children()[0].lift()
  75.  
  76.  
  77. class Green(tk.Frame,StackWidget):
  78.  
  79.     def __init__(self,master,**kwargs):
  80.         tk.Frame.__init__(self,master,**kwargs)
  81.         StackWidget.__init__(self,master)
  82.         self.config(height=200, bg='lightgreen', relief='solid', width=100, bd=2)
  83.         # widget definitions ===================================
  84.         self.label = tk.Label(self,name='#3_label',bg='lightgreen', text='green')
  85.         self.label.place(x='3', y='3')
  86.  
  87. class Red(tk.Frame,StackWidget):
  88.  
  89.     def __init__(self,master,**kwargs):
  90.         tk.Frame.__init__(self,master,**kwargs)
  91.         StackWidget.__init__(self,master)
  92.         self.config(height=200, bg='red', relief='solid', width=100, bd=2)
  93.         # widget definitions ===================================
  94.         self.label = tk.Label(self,name='#4_label',bg='red', text='red')
  95.         self.label.place(x='3', y='3')
  96.  
  97. class Yellow(tk.Frame,StackWidget):
  98.  
  99.     def __init__(self,master,**kwargs):
  100.         tk.Frame.__init__(self,master,**kwargs)
  101.         StackWidget.__init__(self,master)
  102.         self.config(height=200, bg='yellow', relief='solid', width=100, bd=2)
  103.         # widget definitions ===================================
  104.         self.label = tk.Label(self,name='#5_label',bg='yellow', text='yellow')
  105.         self.label.place(x='3', y='3')
  106.  
  107.  
  108. if __name__ == '__main__':
  109.     Application().mainloop()


Durch mehrmaliges down oder up kann man widgets dann auch beliebig im Stapel platzieren.
Benutzeravatar
wuf
User
Beiträge: 1319
Registriert: Sonntag 8. Juni 2003, 09:50

Re: Übereinander Reihenfolge von Widgets

Beitragvon wuf » Montag 19. Juni 2017, 21:52

Alfons hat geschrieben:Hi wuf, das hatte ich mir auch fast gedacht, aber noch nicht ausprobiert. Wie findest Du dieses Snippet:

Freut mich dass dir mein Tipp mit dem w.winfo_children() geholfen hat.

Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Re: Übereinander Reihenfolge von Widgets

Beitragvon Alfons Mittelmeyer » Montag 19. Juni 2017, 22:06

wuf hat geschrieben:
Alfons hat geschrieben:Hi wuf, das hatte ich mir auch fast gedacht, aber noch nicht ausprobiert. Wie findest Du dieses Snippet:

Freut mich dass dir mein Tipp mit dem w.winfo_children() geholfen hat.

Gruss wuf :wink:

Naja, nur ein wenig, denn ausprobiert hätte ich eh, ob meine Vermutung stimmt.

Aber Du kennst Dich ja hervorragend mit tkinter aus.
Früher hatte ich mich an effbot orientiert. Aber die vergessen oft Wesentliches, das ich dann auch nicht implementiert hatte.

Bei grid_rowconfigure und grid_columnconfigure wird 'uniform' nicht erwähnt.
Und beim PanedWindow wird sogar das Wichtigste vergessen, nämlich 'stretch'.
Das habe ich aber mittlerweile implementiert. Und 'uniform' soll eine bedeutende Rolle in meinem neuen Grid Konzept spielen. Ausprobiert habe ich aber da auch noch nchts, sondern nur darüber etwas aufgeschnappt.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder