Wie bekomme ich grid_rowconfigure wieder weg?

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

Also folgendes Problem, ich hatte eine Grid Tabelle.
Dann hab ich einen Frame gemacht und in dem Frame ein weiteres Grid.
Dazu habe ich aber grid_rowconfigure und grid_columnconfigure genommen und gleich 10 Zeilen und 6 Spalten genommen.
Dann wollte ich diese Zeilen und Spalten wieder wegbekommen. Ging aber nicht.
Kann man grid_rowconfigure und grid_columnconfigure irgendwie wieder rückgängig machen, ohne das Programmm neu zu starten?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Könntest du dein Beispiel in Form eines lauffähigem Codesnippet präsentieren damit man üben kann? Wie du selber weisst braucht es bei Tkinter immer ein wenig Forscherarbeit da die 10 Bücher auf deinem Tische oder die Suche im ganze Internet die Lampe nicht zum brennen bring.

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

@wuf Hi wuf, das musst Du Dir anschauen. Der GUI Designer hat nun Grid in schöner Tabellenform. Damit kannst Du das dann nachvollziehen. Die Zeilen die man zuviel gemacht hat, gehen nicht mehr weg. Außer durch Speichern und neu laden.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Ist es möglich, dass im Feld Layout die Eingaben für Row und Columns vertauscht sind? Weil im Feld Layout Options werden diese unter row und column bei mir vertauscht angezeigt.

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

Meinst Du, die vorige GUI Designer Version? Könnte sein, dass ich im Basis Layout die Rows über den Colums angezeigt hatte und in den Options umgekehrt. Gestimmt hat es jedenfalls. Und in der neuen Version tauchen die im Basis Layout eh nicht mehr auf. Da gibt es zwar auch diese Bezeichnung. Doch da bezieht sie sich auf die Höhe und Breite der Tabelle.

Ob man sie wieder in das Basis Layout aufnehmen soll? Dann wirkt es nur überladen. Einmal die Information reicht ja auch, sofern man sie benötigt. Ist jetzt eh jetzt ganz anders.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Betreffs Version. Habe die letzte vor dem Mittagessen heruntergeladen. Mein Tipp wäre es dir möglich die Versionsnummer & Buildnummer in der Titelleiste des DynTkinter GuiDesigners einzublenden damit wir vom gleichen sprechen. Betreffs vertauschter Rows & Columns Eingabe. Ich platzierte ein Label-1 mit row=0 & column=0 danach ein Label-2 mit row=0 & column=1 auf dem Gui-Hauptfenster. Die Labels werden aber untereinanter statt nebeneinander platziert.

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

Hi wuf. Das hat immer richtig funktioniert. Weißt Du noch, auf welchen Button Du gedrückt hast? Rechts ist 'grid' und links ist 'grid()'. Falls Du auf den linken Button gedrückt hättest, dann wäre es kein Wunder, wel das das grid() ohne Parameter ist. Nützlich, wenn Du etwa ein 'unlayout' entsprechend 'grid_remove' gemacht hast. Wenn ich auf grid() statt grid drücke, dann kommt es bei mir auch untereinander. Der rechte Button ist der richtige.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Sorry du hast recht. Ich habe Grid() verwendet um die Labels zu positionieren. Bei Verwendung von GRID ist es so, dass nach dem platzieren des ersten Labels dann das zweite Label im Gui-Fenster aber über das erste gelegt wird. Dann muss ich nachträglich den Rahmen für Layout Options öffnen und dort mittels der Optionseingabe für row & column das Label positionieren. Ich dachte zuerst, dass im Rahmen Layout die leeren Eingabefelder unter Rows & Columns für die Festlegung der Gridpositions-Koordinaten (row & column) dienen und dann beim aktivieren des Buttons GRID iese direkt für die Platzierung des Labels übernommen werden. Also ein Bedienungsfehler das bei den ersten Gehversuchen ohne nähere Anleitung passiert.

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

Hi wuf Da gibt es rechts neben col eine Checkbox, wenn Du nach rechts erfasssen willst.

Die Checkbox rechts neben row ist aber auch gut. Da kann man schön nach unten schreiben, etwa:

Vorname
Name
Telefon
Strasse
PLZ
Ortz

Aber Du musst unbedingt die neue Version ausprobieren. Die habe ich erst kurz nach Mittag draufgespielt und bei der ist GRID ganz anders. Da siehst Du Tabellenlinien, siehst wie sich sich verschieben, wie Du am Besten rowspan und colspan anpasst. Und da positioniert man mit der Maus.

Hier siehst Du, wie gerade das neue Menü editiert wird:

Bild

War leider kein gutes Beispiel. Aber wenn Du etwa eine Listbox reintust, dann siehst Du, dass Du an den Linien, dass Du den Rowspan auf 5 und den Colspan auf zwei setzen musst bei eta 25 Pixel Höhe und 75 Pixel Breite.
Zuletzt geändert von Alfons Mittelmeyer am Donnerstag 1. Oktober 2015, 19:41, insgesamt 1-mal geändert.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Sorry! Die von dir erwähnte Checkbox(en) kann ich nicht finden. Wo befinden sich die genau?

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

Hi wuf, wenn wir von der bisherigen Version bis heute mittag sprechen, dann ist zwichen der Spinbox col und dem Button new row eine kleine Checkbox (darunter steht dann 'inc' für increase. Nach einer Eingabe mittels 'grid' erhöht sich dann 'col' um eins. Das Gleiche gibt es auch zwischen 'row' und 'new col'. Beide ankreuzen macht wenig Sinn, denn das wäre diagonal.

Bild
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Habe um ca. 20:00 die letzte Version von GitHub runtergeladen:
Bild
Hier kann ich keine deiner Bezeichnungen finden.

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

Ja wuf, bei dieser Version nicht mehr. Seit kurz nach Mittag gibt es das nicht mehr. Dafür hat man jetzt die Tabellenform mit Widget bewegen mittels Maus.

Gib einfach mal 15 bei Rows ein und 8 bei Colums und drück auf Show. Wahrscheinlich, braucht es da Show gar nicht mehr. Und schau was dann kommt. Und wenn Du mit GRID ein Widget aufgenommen hast, dann klick drauf und ziehe es.

Aber besser nicht Min Width auf Null stellen. Hatte einen Crash. Vielleicht hat dann ja tkinter durch 0 geteilt, Sollte ich vielleicht 0 nicht erlauben.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Jetzt ist es klar. Danke für deine Erklärungen. Werde mich mit der Bedienung deines DynTkinter GuiDesigner weiter beschäftigen.

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

Hi wuf, ich könnte grid weiter verfeinern, denn die Zeilenhöhen, Spaltenbreiten, pad und weight kann man auch individuell für jede Zeile und Spalte einstellen.
Aber ich denke, ich sollte mich zuerst mal um Interca Kompatibilität zu ähnlichen Programmen kümmern.

Wollte auch tkinter erzeugen, aber die Lösungen sind nicht wirklich überzeugend. Für kleine Beispiele geht es natürlich, für umfangreichere Anwendungen aber gibt es da keine gute Lösung.

Entweder alles global machen, mit Parent über Stack oder lokal machen mit verschachtelten Funktione und immer weiter einrücken und dabei schön Leerzeichen zählen.
Aber ich glaube, solche Lösungen will fast keiner.

Dann wohl zuerst Interface Kompatibilität mit anderen Produkten und auch eigene Klassen zulassen.

Ach so, weiß nicht, ob Dich das interessiert. Der Code Trick. Hier siehst Du zwei Kommentare. der erste ist:

### CODE ===

Der zweite ist:

### ===

Code: Alles auswählen

Button('Layout',text="""ON""",bg='green').grid(column='3',sticky='ew',row='0')
Button('Create',text="""ON""",bg='green').grid(column='1',sticky='ew',row='1')
Button('Config',text="""ON""",bg='green').grid(column='1',sticky='ew',row='0')
Button('Mouse',text="""ON""",bg='green').grid(column='3',sticky='ew',row='1')
Label('Label',text="""Config:""",width='6').grid(row='0')
Label('Label',text="""Layout:""").grid(column='2',row='0')
Label('Label',text="""Create:""",width='6').grid(row='1')
Label('Label',text="""Mouse:""",width='6').grid(row='1',column=2)

### CODE ===================================================

# The command is initialized with config options switched off (False)
# When pressed, this switch is toggled and a message 'SHOW_CONFIG' is sent, which contains this ON/OFF value
# Further the button text is toggled between ON and OFF and the bg color between green and orange

widget("Config").mydata = False
widget("Layout").mydata = False
widget("Create").mydata = False
widget("Mouse").mydata = False

def function_callback(me,message_to_send):
    me.mydata = not me.mydata
    if message_to_send == "MOUSE_SELECT_ON": container().is_mouse_select_on = me.mydata
    send(message_to_send,me.mydata)
    if me.mydata: me.config(text="OFF",bg="orange")
    else: me.config(text="ON",bg="green")

def call(widget_name,message_to_send,callback=function_callback):
    widget(widget_name).do_command(callback,message_to_send,True)

call("Config","SHOW_CONFIG")
call("Layout","SHOW_LAYOUT")
call("Create","SHOW_CREATE")
call("Mouse","MOUSE_SELECT_ON")

send("SHOW_CREATE",False)


def switch_mouse_on(mouse_button=widget("Mouse"),funct=function_callback):
    if not mouse_button.mydata: funct(mouse_button,"MOUSE_SELECT_ON")

do_receive("SWITCH_MOUSE_ON",switch_mouse_on)

### ========================================================
Kannst Du Dir vorstellen, was diese Kommentare bedeuten?

Der GUI Designer lädt das ganze Script. Aber was zwischen diesen Kommentaren steht wird nochmal zwischengespeichert. Wenn man die GUI Widgets verändert hat und speichert, wird auch der Code dazu wieder unverändert mit abgespeichert.

Bei Load & Edit wird der Code beim Laden des Scripts nicht ausgeführt. Also man bekommt dann die Widgets jungfräulich. Bei Load & Run dagegen wird der Codeteil mit ausgeführt. Dabei könnten natürlich auch Widgets verändert worden sein, etwa pack_forget, grid_remove und solche Sachen.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Sorry um den Code im Detail zu verstehen müsste ich tiefer in dein Projekte eintauchen. Diese Zeit habe ich momentan leider nicht. Manchmal kann es vorkommen, dass die Oberfläche des DynTkinter GuiDesigners geschrumpft angezeigt wird. Um wieder die ganze Oberfläche anzuzeigen gibt es dann nur zwei Möglichkeiten. Entweder das Fenster auf Fullscreen bringen oder mit der Maus an den Fensterecken zu ziehen bis man wieder die ganze Designer-Oberfläche sieht. Könntest du in einem solchen Falle das Designerfenster nicht über die 'Refresh-Funktion' wieder auf seine normale Abmessungen bringen. Noch ein Tipp zur Bewegung eines Widgets in einer angezeigten Tabelle mit der Maus. Das Widget nicht nur mit einem Click an die Maus hängen sondern, dass hierfür noch eine Tastaturtaste wie z.B. 'Ctrl' gedrückt werden muss. Der Click sollte eigendlich nur die Konfigurationsdaten bzw. Layoutoptionen zur Anzeige bringen. Und last but not least die momentan gültige Version des Designers unbedingt irgendwo einblenden.

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

Hi wuf,

da sollte ich hier im Forum mal fragen, wie man so etwas tun kann. Ein tkinter Fenster passt sich der Größe des Inhaltes an, aber nur solange man nicht die Geometrie setzt. Und eimal kurz an einer Ecke gezogen bedeutet, man hat die Geometrie manuell gesetzt und das Fenster paßt sich dann nicht mehr an. Ob man den urprünglichen Zusand dann wieder herstellen kann, ist fraglich. Aber beim GUI Desingner würde es gehen, indem man ihn auf einen Buttondruck hin ganz rauswirft und neu nachlädt. Der GUI Designer ist nur Bedienung und merkt sich selber nichts über die Widgets mit Ausnahme der Auswahlbuttons im Select Fenster, die aber nur einen Callback für die Auswahl haben und sowieso immer wieder beseitigt und neu aufgebaut werden.

Also GUI Designer ganz rauswerfen und dann automatisch wieder laden ist möglich. Aber dann wären die vier Buttons in den Options wieder auf dem Anfangszustand.

Könnte ja mal nachdenken, ob man sich dabei die Buttonzustände merkt und dann nach dem neu Laden wieder neu setzen könnte. Gehen müßte das schon, denn das Menü und die Namen der Buttons sind ja bekannt.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Kannst du das folgende einmal angucken:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from functools import partial

try:
    # Tkinter for Python 2.xx
    import Tkinter as tk
    import tkFont as fnt
except:
    # Tkinter for Python 3.xx
    import tkinter as tk
    import tkinter.font as fnt

APP_TITLE = "Refresh Geometry"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 300
APP_HEIGHT = 200


class Application(tk.Frame):

    def __init__(self, master):
        self.master = master
        self.master.protocol("WM_DELETE_WINDOW", self.close)
        tk.Frame.__init__(self, master)

        master.bind('<Button-1>', self.refresh)
        canvas1 = tk.Canvas(self, bg='steelblue')
        canvas1.pack(side='left')

        canvas2 = tk.Canvas(self, bg='khaki1')
        canvas2.pack(side='left')
    
    def refresh(self, event):
        print('Refresh')
        self.master.geometry('')

        
    def close(self):
        print("Application-Shutdown")
        self.master.destroy()
    
def main():
    app_win = tk.Tk()
    app_win.title(APP_TITLE)
   
    app = Application(app_win).pack(fill='both', expand=True, padx=6, pady=6)

    app_win.mainloop()
 
 
if __name__ == '__main__':
    main()      
Verändere die Fenstergeometrie durch Manipulation der Fensterecken mit der Maus. Gebe danach ein Click mit der linken Maustaste ins Fenster.

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

Hi wuf, das mit destroy und neu laden geht. Problem noch, das Fenster ist dann nicht in der gleichen Position wie zuvor. Muss noch herausbringen, wie ich diie Position ändern kann ohne geometry zu benutzen.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hier noch eine kleine Ergänzung:

Code: Alles auswählen

    def refresh(self, event):
        print('Refresh')
        self.master.geometry('')
        self.master.geometry("+100+100")
Gruss wuf :wink:
Take it easy Mates!
Antworten