Seite 1 von 2

Zwei kurze Fragen

Verfasst: Sonntag 19. Juni 2011, 13:21
von questlove
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 :)

Re: Zwei kurze Fragen

Verfasst: Sonntag 19. Juni 2011, 13:36
von questlove
bei 1.: verkleinern schon, aber nicht mehr vergrößern ;)

Re: Zwei kurze Fragen

Verfasst: Sonntag 19. Juni 2011, 14:26
von wuf
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:

Re: Zwei kurze Fragen

Verfasst: Sonntag 19. Juni 2011, 14:29
von questlove
danke :)

Re: Zwei kurze Fragen

Verfasst: Sonntag 19. Juni 2011, 14:33
von wuf
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:

Re: Zwei kurze Fragen

Verfasst: Sonntag 19. Juni 2011, 15:35
von questlove
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...

Re: Zwei kurze Fragen

Verfasst: Sonntag 19. Juni 2011, 18:25
von wuf
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:

Re: Zwei kurze Fragen

Verfasst: Sonntag 19. Juni 2011, 19:02
von questlove
sehr nett :)
vielen dank..

Re: Zwei kurze Fragen

Verfasst: Montag 20. Juni 2011, 08:31
von questlove
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

;)

Re: Zwei kurze Fragen

Verfasst: Montag 20. Juni 2011, 08:45
von Xynon1
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.

Re: Zwei kurze Fragen

Verfasst: Montag 20. Juni 2011, 10:00
von questlove
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?

Re: Zwei kurze Fragen

Verfasst: Montag 20. Juni 2011, 10:17
von Xynon1
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.

Re: Zwei kurze Fragen

Verfasst: Montag 20. Juni 2011, 11:09
von questlove
tut mir leid aber ich finde da garnichts..
kann mir irgentjemand erklären wie das geht, auch mit positionierung?

Re: Zwei kurze Fragen

Verfasst: Montag 20. Juni 2011, 11:14
von Xynon1
Na in dem du die ".create_bitmap"- oder ".create_image"-Methode vom Canvas benutzt.

Re: Zwei kurze Fragen

Verfasst: Montag 20. Juni 2011, 11:21
von questlove
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.

Re: Zwei kurze Fragen

Verfasst: Montag 20. Juni 2011, 11:44
von Xynon1
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.

Re: Zwei kurze Fragen

Verfasst: Freitag 2. September 2011, 13:19
von questlove
nochmal eine kurze frage:

wie kann man dem schließen des Fensters duch das rote X noch methoden hinzufügen?

Re: Zwei kurze Fragen

Verfasst: Freitag 2. September 2011, 15:11
von wuf
Hi questlove

Code: Alles auswählen

app_win.protocol("WM_DELETE_WINDOW", close_app_win)
Gruß wuf :wink:

Re: Zwei kurze Fragen

Verfasst: Montag 10. Oktober 2011, 14:26
von questlove
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

Re: Zwei kurze Fragen

Verfasst: Montag 10. Oktober 2011, 15:48
von 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.