2017-07-07 8 views
2

Ich arbeite an einer Tkinter GUI und ich möchte Fenstergröße und Positionierung in seiner separaten Klasse hinzufügen. Meine Struktur ist wie folgt:Verwenden Sie eine Klasse, um Parameter in einer anderen Klasse zu setzen - Python

class MainApp(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     container = tk.Frame(self) 
     container.pack(side="top", fill="both", expand=True) 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 
     self.winsize= WinSize(container, 700, 500, 650, 450, True, True) 

Ich möchte WinSize die Geometrie der Hauptanwendung setzen sowie Griff die minsize, resizeable in der WinSize Klasse.

class WinSize: 

    def __init__(self, container, width, height, minx, miny, sizeablex, sizeabley): 
     self.container = container 
     self.width = width 
     self.height = height 
     self.minx = minx 
     self.miny = miny 
     self.sizeablex = sizeablex 
     self.sizeabley = sizeabley 
     self.ws = self.container.winfo_screenwidth() 
     self.hs = self.container.winfo_screenheight() 
     self.xpos = (self.ws/2) - (self.width/2) 
     self.ypos = (self.hs/2) - (self.height/2) 

Ich habe keine Lösung/Anleitung ausführlich und fand die Suche auf, wie diese umgesetzt in der WinSize Klasse für diese bestimmte Instanz und/oder Rahmen zu erhalten. Ich möchte dieselbe Klasse verwenden, um Größen und andere Attribute für Popup-Nachrichten/Frames festzulegen, die andere Informationen anzeigen. Die Haupt GUI-Klasse wird von @Bryan Oakley berühmtes Beispiel genommen: https://stackoverflow.com/a/7557028/7703610

Wie rufe ich die geometry, minsize und resizeable von Tk ohne Tk wieder in meine WinSize Klasse zu erben hat und es dann auf die jeweilige Instanz anwenden?

Antwort

1

Es gibt zwei Lösungen. Sie können das Fenster an WinSize() anstelle des Containers übergeben, oder Sie können die winfo_toplevel Methode verwenden, um das Fenster für ein bestimmtes Widget zu erhalten.

Die erste Lösung würde wie folgt aussehen:

class MainApp(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     ... 
     self.winsize= WinSize(self, 700, 500, 650, 450, True, True) 

class WinSize: 

    def __init__(self, window, width, height, minx, miny, sizeablex, sizeabley): 
     self.window = window 
     ... 
     self.window.geometry("%d%d+%d+%d" % (width, height, minx, miny)) 
     ... 

Die zweite Lösung erfordert keine Änderungen an dem Haupt-App. Fügen Sie einfach Folgendes zu WinSize:

class WinSize: 
    def __init__(...): 
     ... 
     window = self.container.winfo_toplevel() 
     self.window.geometry("%d%d+%d+%d" % (width, height, minx, miny)) 
+0

Danke @Bryan Oakley. Liebe, wie einfach du deine Lösungen machst. Ich wünschte, du hättest eine Reihe von Video-Tutorials gemacht und den Rest von uns richtig unterrichtet. Nur eine kurze Frage ... wird "self" im ersten Beispiel in die Variable 'window' übernommen? –

Verwandte Themen