Seite 1 von 1
frame im frame
Verfasst: Samstag 6. Februar 2021, 11:42
von ChristianN
Hallo,
ich muss Euch bitten, einem Junior zu helfen. Ich habe jetzt 1 Woche gegrübelt, siniert und gegoogelt, aber dem Problem nicht näher gekommen. Aber sicher, dass ich einen völligen Denkfehler mache.
Ich möchte in einem Window zwei Frames haben, nebeneinander. In dem Linken sollen vier Frames und in dem Rechten ein Bild plaziert werden. In jedem der vier Frames sollen etwa vier Knöpfe platziert werden, mit denen das Bild manipuliert werden kann (das soll später geschehen). Das Problem ist, dass sobald ich einen Knopf in einem der vier Frames lege, erscheint der Knopf zwischen zwei Frames und einer der vier Frames wird verdrängt. Obwohl der Knopf als "parent" einen der vier Frames hat, scheint aber das Window als "parent" gewertet zu werden. Könnt Ihr bitte einem Unwissenden helfen ?
danke, Christian
from tkinter import *
root = Tk()
root.geometry('1200x700+0+0')
root.configure(bg = "white")
frame_l = Frame(root, height = 700, width = 600, bg = "white")
frame_r = Frame(root, height = 700, width = 600, bg = "blue")
frame_l_0 = Frame(frame_l, height = 150, width = 600, bg = "red")
frame_l_1 = Frame(frame_l, height = 150, width = 600, bg = "yellow")
on_switch = Button(frame_l_1, height = 1, width = 1, bg = "black")
frame_l_2 = Frame(frame_l, height = 200, width = 600, bg = "pink")
frame_l_3 = Frame(frame_l, height = 200, width = 600, bg = "green")
frame_l.grid(column = 0, row = 0, sticky = N)
frame_r.grid(rowspan = 4, row = 0,column = 1, sticky = N)
frame_l_0.grid(column = 0, row = 0, sticky = N)
frame_l_1.grid(column = 0, row = 1, sticky = N)
frame_l_2.grid(column = 0, row = 2, sticky = N)
frame_l_3.grid(column = 0, row = 3, sticky = N)
on_switch.grid()
root.mainloop()
Re: frame im frame
Verfasst: Sonntag 7. Februar 2021, 08:18
von __blackjack__
@ChristianN: Das sieht nur so aus. Der `Frame` ist da, aber exakt genau so gross/klein wie der `Button` den er umschliesst. Vergiss diese absoluten Breiten- und Höhenangaben in den Frames. Beziehungsweise absolute Angaben insgesamt. Das gilt auch für den `geometry()`-Aufruf. Die Fernstergrösse ergibt sich automatisch aus dem Inhalt. Und die Position vorzugeben nervt alle die sich freuen das die Fensterverwaltung einen guten Job macht und neue Fenster dort platziert wo man gesagt hat wo man neue Fenster haben möchte. Die wenigsten Leute wollen alle Fenster an der Position 0, 0 haben. Die meisten wollen sie dort haben wo noch am meisten Platz ist. Eventuell noch eingeschränkt darauf, dass es auf dem Monitor erscheinen soll auf dem beim Starten der Eingabefokus lag.
Re: frame im frame
Verfasst: Sonntag 7. Februar 2021, 10:13
von ChristianN
Danke für Deine Antwort _blackjack_,
so ganz kapier ich Deine Antwort jedoch nicht, die absolute Größe des Fensters läßt sich also nicht mit "width" beeinflussen, der Inhalt ist ausschlaggebend. Wie aber kann ich trotzdem die Größe bestimmen ?
Christian
Re: frame im frame
Verfasst: Sonntag 7. Februar 2021, 10:46
von __deets__
Teil der Antwort war ja: lass das. Der User zieht sich die Größe schon hin. Und der andere Teil: der Inhalt bestimmt die Größe. Wieso siehst du die Notwendigkeit, da einzugreifen?
Re: frame im frame
Verfasst: Montag 8. Februar 2021, 13:39
von ChristianN
Hi _deets_, ich muss nochmal nerven,
die Größe der Button, Labels, etc im Vergleich zum Frame oder Window sollte im Maßstab bleiben, da ich eine Maschine simulieren will. Das Betätigen der Buttons, Regler, etc. soll eine Reaktion bedingen. Da ich das Programm zum Schulen einsetzten möchte, sollte der Schüler schon einen maßstabsgerechten Eindruck haben.
Wenn das aber mit Tkinter nicht zu realisieren ist, kannst Du mir was anderes raten ?
Christian
Re: frame im frame
Verfasst: Montag 8. Februar 2021, 16:02
von __deets__
Das klingt eher so als ob du mehr Richtung “malen” gehen willst, also präzise Kontrolle. ZB tkinter canvas oder Qt QGraphicsView um wirklich zb einen Kolben oder so zu malen, dessen Position aus einem Eingabefeld bezogen wird. Genauer kann ich das nur beurteilen, wenn du vielleicht eine Skizze beibringst.
Re: frame im frame
Verfasst: Montag 8. Februar 2021, 18:36
von ChristianN
Hi, nochmal ich.
im linken Frame möchte ich ein medizinisches Erstversogungsgerät für Babys nach Geburt abbilden, im rechten Frame soll das Baby sein. Wenn ich links im Rahmen die Lampen einschalte, wird das Baby klarer zu sehen. Wenn ich links die Sekunden Uhr einschalte, kann ich nach 60 sec den Puls fühlen, um abzuleiten, welche Richtung ich einschlage. Wenn ich llinks die Heizung einschalte, kann ich ein warmes Baby sehen, oder ich stelle fest, dass das Baby beim 60 sec Check nicht gut drauf ist, weil es zu kalt ist. Oder es ist nicht gut drauf, da ich die Heizung zu heiß eingestellt habe.
Re: frame im frame
Verfasst: Montag 8. Februar 2021, 19:56
von __deets__
Ok, das ist ein ungewöhnlicher Fall. Ist das Gerät links auch konkret dargestellt? Also wirklich grafisch angelehnt an ein echtes Modell? Davon hängt die Strategie ab.
Re: frame im frame
Verfasst: Montag 8. Februar 2021, 22:48
von ChristianN
Re: frame im frame
Verfasst: Dienstag 9. Februar 2021, 07:47
von sparrow
Ich habe so etwas in der Art einmal vor einer halben Ewigkeit gemach. Die GUI-Elemente habe ich aber nicht aus Standardkomponenten zusammengebaut sondern eine SVG-Grafik "gemalt" (was sehr viel angenehmer ist als GUI-Elemente zurecht zu rücken), und das dann mit QT anzeigen lassen. Ich glaube in einem WebView. Das hatte damals den Vorteil, dass man Link-Events darauf abfangen konnte - und so habe ich den Elementen, die klickbar waren, einfach einen Link gegeben und konnte auf dessen Klick dann im Programm reagieren.
Re: frame im frame
Verfasst: Dienstag 9. Februar 2021, 08:32
von __deets__
Ich würde auch sagen, das dies ein eher ungewöhnlicher Anwendungsfall ist.
SVG klingt gut. Damit würde das ganze auch als Webanwendung funktionieren.
Man könnte auch pygame und Pixelgrafiken verwenden.
Re: frame im frame
Verfasst: Dienstag 9. Februar 2021, 09:05
von ChristianN
Hi, ich danke für Eure Ideen, ich muss sie allerdings ganz verstehen, um abzuschätzen, ob ich so weit gehen will/kann. Klingt doch für mich so, dass zwei Wege vorgeschlagen werden.
1. Die Grafik über SVG (Vektorgrafiken) entwickeln, mit Qt auf dem Bildschirm präsentieren, um dann mit einer Programmiersprache, z.B. Python zu steuern
2. Die Grafik über Pixelgrafiken entwickeln, mit Pygame, als Python-Bibliothek auf dem Bildschirm zu präsentieren und mit Python zu steuern
Wenn ich das so grob richtig verstanden habe, muss ich recherchieren, um den Aufwand für mich abschätzen zu können. Bitte sagt mir Bescheid, ob ich das richtig verstanden habe.
danke, Christian
Re: frame im frame
Verfasst: Dienstag 9. Februar 2021, 09:07
von __deets__
Ja, das klingt so als ob du das Prinzip verstanden hast. Im ersten Fall wäre statt Qt auch ein Browser & JavaScript im Spiel, statt Python. Also eine Webanwendung.
Re: frame im frame
Verfasst: Dienstag 9. Februar 2021, 10:00
von ChristianN
Da ich mir vorgenommen hatte Python zu lernen, bietet sich die zweite Lösung an. Dann leg ich mal los, mehr über pygame zu lernen.
danke, Christian