frame im frame

Fragen zu Tkinter.
Antworten
ChristianN
User
Beiträge: 9
Registriert: Mittwoch 3. Februar 2021, 16:51

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()
Benutzeravatar
__blackjack__
User
Beiträge: 13120
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
ChristianN
User
Beiträge: 9
Registriert: Mittwoch 3. Februar 2021, 16:51

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
ChristianN
User
Beiträge: 9
Registriert: Mittwoch 3. Februar 2021, 16:51

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
ChristianN
User
Beiträge: 9
Registriert: Mittwoch 3. Februar 2021, 16:51

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
ChristianN
User
Beiträge: 9
Registriert: Mittwoch 3. Februar 2021, 16:51

hi nochmal, genau wie das model: https://d100567.odilo.greatnet.de//data ... hp?lang=de

christian
Benutzeravatar
sparrow
User
Beiträge: 4196
Registriert: Freitag 17. April 2009, 10:28

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
ChristianN
User
Beiträge: 9
Registriert: Mittwoch 3. Februar 2021, 16:51

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
ChristianN
User
Beiträge: 9
Registriert: Mittwoch 3. Februar 2021, 16:51

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
Antworten