Variablen mit mehreren Zeilen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
seelosp
User
Beiträge: 11
Registriert: Freitag 27. Januar 2012, 16:02

Hallo,
ich habe ein Problem. Ich möcht eine Variable mit mehreren Zeilen erstellen.
Das klappt auch. Nur bei dieser methode kommt "Syntax error":

Code: Alles auswählen

    grösse = name3.get()+x+name4.get()
    file = "from tkinter import* \n\
    window = Tk() \n\
    window.geometry (\""+grösse+"\")\n\
    window.title (\""+name1.get()+"\")\n\
    text5 = Label (window, text = \""+name2.get())+"\")\n\
    text5.place (x=10,y=30)"
    print (file)
Danke im Vorraus!
seelosp
Zuletzt geändert von seelosp am Freitag 27. Januar 2012, 16:33, insgesamt 1-mal geändert.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo,

das ist ja ein ziemliches Durcheinander von Anführungszeichen, Escape-Zeichen etc. Warum nutzt du nicht einfach triple-Quotes ("""test""")? Die gehen über Zeilenenden hinweg, so dass du die nicht maskieren musst und du kannst auch " und ' darin ganz normal verwenden.

lg,

brb
seelosp
User
Beiträge: 11
Registriert: Freitag 27. Januar 2012, 16:02

Sorry,
bin leider anfänger :D
ein beispiel bitte :(
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

file = """from tkinter import *
    window = Tk()
    window.geometry({0})
    window.title({1})
    text5 = Label(window, text={2})
    text5.place(x=10,y=30)""".format(
        grösse, name1.get(), name2.get())
(ungetestet, Angaben sind wie immer ohne Gewähr)

Ich nehme an, du verwendest Python3. Ansonsten wäre der Name grösse ja ungültig. Du solltest dich (nach Durcharbeitung des Tutorials) mit dem Thema String-Formatting beschäftigen.
seelosp
User
Beiträge: 11
Registriert: Freitag 27. Januar 2012, 16:02

Barabbas hat geschrieben:Hallo,

das ist ja ein ziemliches Durcheinander von Anführungszeichen, Escape-Zeichen etc. Warum nutzt du nicht einfach triple-Quotes ("""test""")? Die gehen über Zeilenenden hinweg, so dass du die nicht maskieren musst und du kannst auch " und ' darin ganz normal verwenden.

lg,

brb
Das wäre zwar einfacher,
aber bei meinem Proplem hilft das auch nicht :( .
Ich glaube das ist das proplem:
Python kann in die Mehrzeilige Variable keine anderen Variablen einfügen
(bsp.

Code: Alles auswählen

file = "Hi\n\
Hi"+bsp+"hi"
)
+bsp+ klappt nicht.
seelosp
User
Beiträge: 11
Registriert: Freitag 27. Januar 2012, 16:02

derdon hat geschrieben:

Code: Alles auswählen

file = """from tkinter import *
    window = Tk()
    window.geometry({0})
    window.title({1})
    text5 = Label(window, text={2})
    text5.place(x=10,y=30)""".format(
        grösse, name1.get(), name2.get())
(ungetestet, Angaben sind wie immer ohne Gewähr)

Ich nehme an, du verwendest Python3. Ansonsten wäre der Name grösse ja ungültig. Du solltest dich (nach Durcharbeitung des Tutorials) mit dem Thema String-Formatting beschäftigen.
Cool! Danke,
werde es gleich testen!
BlackJack

@seelosp: Warum generierst Du Quelltext? Das ist in der Regel keine gute Idee.
seelosp
User
Beiträge: 11
Registriert: Freitag 27. Januar 2012, 16:02

Warum keine gute Idee?
An derdon: Danke! es funktioniert super!
seelosp
User
Beiträge: 11
Registriert: Freitag 27. Januar 2012, 16:02

BlackJack hat geschrieben:@seelosp: Warum generierst Du Quelltext? Das ist in der Regel keine gute Idee.
Ich habe ein Programm geschrieben das den Quellcode für ein Message-Fenster generiert!
Funktioniert super! :mrgreen:
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

seelosp hat geschrieben:Ich habe ein Programm geschrieben das den Quellcode für ein Message-Fenster generiert!
Warum sollte jemand sowas tun wollen? Wenn er noch seine sieben Zwetschgen beieinander hat? Warum nicht einfach:

Code: Alles auswählen

import tkinter

def make_window(size, name_a, name_b):
    window = tkinter.Tk()
    window.geometry(size)
    window.title(name_a)
    text5 = tkinter.Label(window, text=name_b)
    text5.place(x=10,y=30)
    return window

my_window = make_window(grösse, name1.get(), name2.get())
Anders ausgedrückt: vermutlich möchtest du lernen, was Funktionen sind, wie man sie verwendet, und wie man sie baut.
In specifications, Murphy's Law supersedes Ohm's.
seelosp
User
Beiträge: 11
Registriert: Freitag 27. Januar 2012, 16:02

pillmuncher hat geschrieben:
seelosp hat geschrieben:Ich habe ein Programm geschrieben das den Quellcode für ein Message-Fenster generiert!
Warum sollte jemand sowas tun wollen? Wenn er noch seine sieben Zwetschgen beieinander hat? Warum nicht einfach:

Code: Alles auswählen

import tkinter

def make_window(size, name_a, name_b):
    window = tkinter.Tk()
    window.geometry(size)
    window.title(name_a)
    text5 = tkinter.Label(window, text=name_b)
    text5.place(x=10,y=30)
    return window

my_window = make_window(grösse, name1.get(), name2.get())
Anders ausgedrückt: vermutlich möchtest du lernen, was Funktionen sind, wie man sie verwendet, und wie man sie baut.
So kann man es Ausdrücken. Das Programm erleichtert mir aber auch die arbeit bei anderen
Programmen :D
seelosp
User
Beiträge: 11
Registriert: Freitag 27. Januar 2012, 16:02

Hab's fertig!
Will aber noch ein paar funktionen einfügen :D
Download: https://rapidshare.com/files/2308101578 ... builder.py
BlackJack

Weil sicher nicht jeder Lust hat eine Datei *dort* herunter zu laden: http://paste.pocoo.org/show/541750/
seelosp
User
Beiträge: 11
Registriert: Freitag 27. Januar 2012, 16:02

Danke so geht das "downloaden" besser :D
theo.puke
User
Beiträge: 17
Registriert: Samstag 21. Januar 2012, 16:17

In dem Code gibt es ja überhaubt kein Fehlerhandling. Da muss man noch ein paar try und catch Ausdrücke verwenden.
BlackJack

@seelosp: Wieso erleichtert das die Arbeit bei anderen Programmen?

Du solltest ganz dringend von `place()` weg kommen, denn Deine GUI funktioniert sonst nur bei Dir zuverlässig. Bei einer anderen Bildschirmauflösung, anderen Schriftgrössen oder -arten, anderen Themes, usw. passen diese absoluten Positionen nicht unbedingt. Bei mir sieht das zum Beispiel gerade so aus:
Bild

Noch nicht unbenutzbar, aber auch nicht schön.

Der Test-Code ist falsch, denn es darf innerhalb eines Programms immer nur ein Exemplar von `Tk` geben. Wenn man ein zweites erstellt, ist das Verhalten undefiniert und kann von komisch bis harter Programmabsturz gehen. Weitere Fenster neben dem Hauptfenster muss man mit `Toplevel` erstellen.

Den Sternchen-Import sollte man auch lassen. Damit holst Du Dir alle Namen aus dem Modul in den Namensraum des importierenden Moduls. Spätestens wenn Du noch andere Module so importierst wird es irgend wann unübersichtlich, weil man nicht mehr so einfach heraus finden kann, welcher Name aus welchem Modul stammt. Ausserdem passieren dann auch mal schnell Namenskollisionen. Bei `tkinter` und `PIL` ist zum Beispiel `Image` beliebter Kandidat dafür.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

theo.puke hat geschrieben:In dem Code gibt es ja überhaubt kein Fehlerhandling. Da muss man noch ein paar try und catch Ausdrücke verwenden.
Wo soll denn da ein Fehler auftreten?
seelosp
User
Beiträge: 11
Registriert: Freitag 27. Januar 2012, 16:02

BlackJack hat geschrieben:@seelosp: Wieso erleichtert das die Arbeit bei anderen Programmen?

Du solltest ganz dringend von `place()` weg kommen, denn Deine GUI funktioniert sonst nur bei Dir zuverlässig. Bei einer anderen Bildschirmauflösung, anderen Schriftgrössen oder -arten, anderen Themes, usw. passen diese absoluten Positionen nicht unbedingt. Bei mir sieht das zum Beispiel gerade so aus:
Bild

Noch nicht unbenutzbar, aber auch nicht schön.

Der Test-Code ist falsch, denn es darf innerhalb eines Programms immer nur ein Exemplar von `Tk` geben. Wenn man ein zweites erstellt, ist das Verhalten undefiniert und kann von komisch bis harter Programmabsturz gehen. Weitere Fenster neben dem Hauptfenster muss man mit `Toplevel` erstellen.

Den Sternchen-Import sollte man auch lassen. Damit holst Du Dir alle Namen aus dem Modul in den Namensraum des importierenden Moduls. Spätestens wenn Du noch andere Module so importierst wird es irgend wann unübersichtlich, weil man nicht mehr so einfach heraus finden kann, welcher Name aus welchem Modul stammt. Ausserdem passieren dann auch mal schnell Namenskollisionen. Bei `tkinter` und `PIL` ist zum Beispiel `Image` beliebter Kandidat dafür.
Sorry... aber ich habe schon mal ein Programm mit 10 Tk()s geschrieben :wink:
Zuletzt geändert von seelosp am Samstag 28. Januar 2012, 09:54, insgesamt 1-mal geändert.
seelosp
User
Beiträge: 11
Registriert: Freitag 27. Januar 2012, 16:02

Soll ich stattdessen pack() benutzen? Und wie ändert man dort die Position?
BlackJack

@seelosp: Bei `pack()` kann man angeben an welcher Seite des Container-Widgets platziert werden soll, und bei `grid()` an welcher Reihe/Spalte im Gitter. Man darf innerhalb eines Container-Widgets nur eine Layout-Methode verwenden, und bei `place()` sollte man immer die gleiche Seite wählen. Und wo es Sinn macht oder nötig ist, kann man `Frame`\s als Container-Widgets zum Gruppieren einführen.
Antworten