Zwei kurze Fragen

Fragen zu Tkinter.
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

1 Wie kann ich en tkinter fenster (root = TK()) so festsetzten dass man es nicht mehr mit dem Mauszeiger verändern kann?

2. Wie kann ich die widgets in einem Fenster wie Button und Entry genau positionieren, also dass die nicht einlach untereinander liegen und dazwischen kein platz ist.

danke :)
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

bei 1.: verkleinern schon, aber nicht mehr vergrößern ;)
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo questlove

Antwort auf Frage-1:

Code: Alles auswählen

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

import Tkinter as tk

#~~ Lade den Dateiname dieses Skriptes
script_name = sys.argv[0]

#~~ Konstanten für die Abmessungen des Hauptfensters
MAIN_WIN_XPOS   = 10
MAIN_WIN_YPOS   = 10
MAIN_WIN_WIDTH  = 320
MAIN_WIN_HEIGHT = 320

#--- Erstelle ein Tk-Hauptfenster ----
app_win = tk.Tk()

app_win.geometry("%dx%d+%d+%d" % (MAIN_WIN_WIDTH, MAIN_WIN_HEIGHT,
    MAIN_WIN_XPOS, MAIN_WIN_YPOS))

app_win.maxsize(MAIN_WIN_WIDTH, MAIN_WIN_HEIGHT)

app_win['bg'] = 'khaki'
app_win.title(script_name)

app_win.mainloop()
Gruß wuf :wink:
Take it easy Mates!
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

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

Hallo questlove
questlove hat geschrieben:2. Wie kann ich die widgets in einem Fenster wie Button und Entry genau positionieren, also dass die nicht einlach untereinander liegen und dazwischen kein platz ist.
Kannst du uns eine von dir gewünschte Anordnung von Widgets (in einem Fenster) präsentieren?

Gruß wuf :wink:
Take it easy Mates!
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

zum Beispiel würde ich Gerne bei meinem Programm
(http://www.python-forum.de/pastebin.php?mode=view&s=213)
nach dem ein Neues Projekt im Menü Datei aufgerufen wird, dass beim erscheinenden Fenster die Widgets nicht untereinander liegen sondern zum Beispiel der Button ganz unten und mehr platz dazwischen usw...
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo questlove

Habe mich jetzt nur auf die Funktion 'new_project()' konzentriert. Für die Gestaltung des Widgetlayoutes stehen drei Layoutmanger zur Verfügung. Dies sind der Pack-, Grid- oder Place-Layoutmanger. Den Place-Manger würde ich nur für spezielle Fälle verwenden, wo Widgets auf einer absoluten Position positioniert werden müssen. Die beiden anderen Pack- bzw. Grid-Managern ermöglichen eine automatische von der Fenstergrösse abhängigen Platzierung Ich gebrauche hauptsächlich den Pack-Manager. Verwende deshalb öffters das Frame-Widget um Widgets wie 'Labels', 'Entries' usw. zu gruppieren um sie nachher zusammen mit dem Frame als Gruppe im Gesamtlayout zu platzieren. Wenn du in deiner Anwendung ein weiteres Fenster brauchst solltest du das Toplevel-Widget verwendet. Beim schliessen des Hauptfensters werden dann alle geöffneten Toplevel-Fenster auch geschlossen. Für Toplevelwidgets braucht es keinen weiteren Aufruf der '.mainloop()' Methode.

Hier die modifizierte 'new_project()' Funktion:

Code: Alles auswählen

def new_project():
    
    #Erstellung des "Neues Projekt" Fensters
    
    new_project_dialog = tk.Toplevel()
    new_project_dialog.title("Neues Projekt")
    
    width = 200
    height = 300
    xpos = 850
    ypos = 450

    new_project_dialog.geometry('%dx%d+%d+%d' % (width, height, xpos, ypos))
    
    #Funktion des "Fertig" Buttons
    
    def Ende():
        
        projektname = titel.get()
        new_project_dialog.destroy()
        Projektfenster(projektname)
        
    # Widgets des "Neues Projekt" Fensters
    project_name_frame = tk.Frame(new_project_dialog)
    project_name_frame.pack(side='top', fill='x')
      
    name=tk.Label(project_name_frame, text="Projektname:")
    name.pack()
       
    titel=tk.Entry(project_name_frame, bg='white', bd=1, highlightthickness=0)
    titel.pack() 
    
    button_frame = tk.Frame(new_project_dialog) 
    button_frame.pack(side='bottom', fill='x')
     
    finish_button = tk.Button(button_frame, text="Fertig", command=Ende)
    finish_button.pack(side='left')
Gruß wuf :wink:
Take it easy Mates!
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

sehr nett :)
vielen dank..
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

noch so eine kurze ;)

ist es möglich bei einem Polygon in canvas

Code: Alles auswählen

self.clef= [(38,184), (40,190), (47,184), ( 37, 150), (44, 140), (45,155),
                     (32,169), (40,180), (49,175), (46,163), ( 37,168), (40,173)]
self.create_line(self.clef, smooth=True, width=1)
das ich hier mit linien der stärke 1 verbunden habe, zum teil mit solchen und zum teil mir Linien der stärke 2 zu verbinden?
ich würde den dadurch entstehenden Notenschlüssel gerne etwas original getreuer zeichnen

;)
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Da müsstest du einzelne Linien zeichnen, das würde sehr aufwendig werden. Also nimm doch einfach ein/das Bild vom Notenschlüssel.
Im allgemeinen könnte man das gesamte Notationsprogramm aus Bildern zusammfügen, jede Note ein Bild. Das wäre sicherlich übersichtlicher als, in einer Funktion gefühlte 800 Koordinaten zuhaben und keine davon vertauschen darf.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

Das ist natürlich auch eine gute Idee. Ich habe jetzt mir mal ein .gif in der richtigen Größe eines Notenschlüssels erstellt sowie die notenköpfe.
Wie kann ich diese Bilder jetzt in das canvas Fenster einbinden und an die richtige stelle über die Zeilen setzten?
Da braucht man doch os oder?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Sieh dir bitte nochmal den unteren Teil meines Posts an, dann weißt due wie man Bilder auf den Canvas packen kannst.
Die Positionierung ist auch hier nicht ganz einfach, am besten skalierst du alle Bilder auf eine Einheitsgröße und rechnest dann mit dieser oder du schreibst dir ein paar kleine Funktionen um die Größe und damit die Position der Bildobjekte besser bestimmen zu können.
Zuletzt geändert von Xynon1 am Montag 20. Juni 2011, 11:14, insgesamt 1-mal geändert.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

tut mir leid aber ich finde da garnichts..
kann mir irgentjemand erklären wie das geht, auch mit positionierung?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Na in dem du die ".create_bitmap"- oder ".create_image"-Methode vom Canvas benutzt.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

ja aber da erstellt man doch eins und ruft nicht ein bestehendes auf, oder??
da kann man nirgens sagen ich will das bild aus dem ordner.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Ach du hast noch nicht mal die Bilder in den Speicher geladen. Dazu gibt es die Klasse Tkinter.PhotoImage oder Tkinter.BitmapImage. Wie es mit der PIL funktioniert steht auch dabei.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

nochmal eine kurze frage:

wie kann man dem schließen des Fensters duch das rote X noch methoden hinzufügen?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi questlove

Code: Alles auswählen

app_win.protocol("WM_DELETE_WINDOW", close_app_win)
Gruß wuf :wink:
Take it easy Mates!
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

wie mache ich es am besten die widgets in einem Fenster zu platzieren? Zur Zeit habe ich es mit "anchor = W" in der pack-methode gemacht, jedoch kann ich dann nur immer untereinander zum Beispiel Radiobuttons, erzeugen. Ich hätte aber gerne untereinander und nebeneinander radiobuttons(Die aber untereinander nichts miteinander zu tun haben. Sozusagen kann man bei den untereinander etwas auswhlen und bei den nebeneinander am Rand vom Fenster. Wie muss ich sie platzieren?

LG
BlackJack

@questlove: Du könntest die zusammengehörenden Widgets in einen `Frame` stecken (mit `pack()` oder `grid()`) und die `Frame`\s dann in das Fenster (mit `pack()` oder `grid()`). Mit `pack()` kann man nicht nur untereinander, sondern auch nebeneinander anordnen. Aber innerhalb eines Container-Widgets bitte immer nur in eine Richtung, sonst wird es unverhersehbar was die Layout-Engine daraus macht.
Antworten