Zeichenprogramm (Rat gefragt!)

Fragen zu Tkinter.
Antworten
prettyfunkee
User
Beiträge: 4
Registriert: Sonntag 15. März 2009, 15:17

Hallo ihr!!!
Also ich muss bis Mitte nächster Woche ein Zeichenprogramm in Tkinter abliefern und habe als totaler Anfänger mit einigen Problemen zu kämpfen:

1. Warum läuft es nicht?
2. Wie kann ich über Entry Zahlen eingeben, die dann im Programm für die
Seitenlänge, die Koordinaten und die Farbe eingesetzt werden?
(Nachher soll man erst die Form auswählen, also z.B. "Quadrat", dann öffnet sich ein Fenster in das die gefragten Werte eingegeben werden sollen und zuletzt wird dann das Quadrat mit den gewünschten Maßen, Farbe und co. ausgegeben (im ersten Fenster) und das Eingabefenster schließt sich.)
3. Funktioniert das mit den Variablen (siehe Frage 2) auch bei Kreisen, Rechtecken ...?

4.Lässt sich das Gezeichnete am Ende löschen/speichern.


Hier Code: http://paste.pocoo.org/show/108041/

Bitte antwortet GANZ schnell, ich wär euch ewig dankbar dafür!!!

Edit (BlackJack): Lautstärke von Titelzeile runtergedreht und Quelltext ausgelagert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

prettyfunkee hat geschrieben:1. Warum läuft es nicht?
Weil es nicht eingerückt ist.
prettyfunkee hat geschrieben:Bitte antwortet GANZ schnell, ich wär euch ewig dankbar dafür!!!
Schlägt sich GANZ schnell antworten auch finanziell nieder? Ansonsten führt der Topic in Großbuchstaben, das ganze GESCHREIE und Text in fetten Buchstaben, Vermeidung von Code-Tags eher dazu dass Leute eben nicht antworten.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@prettyfunkee: Eigentlich ist es ja eingerückt, das wird aber nur ordentlich angezeigt, wenn man es in Code-Tags setzt, oder bei einem Paste-Service hinterlegt.

Ansonsten ist "läuft nicht" eine viel zu ungenaue Fehlerbeschreibung. Entweder bekommt man von Python eine Fehlermeldung, die solltest Du dann auch verraten, oder das Programm tut nicht das was Du erwartest, dann müsstest Du aber auch verraten *was* Du erwartest, und was das Programm stattdessen tut.

In diesem Fall dürfte das erste Problem eine Fehlermeldung sein, dass die Datei einen `SyntaxError` enthält. Du verwendest Umlaute im Quelltext ohne oben deklariert zu haben, in welcher Kodierung der Quelltext gespeichert ist. Also entweder müsstest Du die Umlaute entfernen, oder der URL in der Fehlermeldung folgen und das was da erklärt wird, umsetzen.

Wenn man das behebt gibt's noch zwei weitere Syntaxfehler, die ziemlich offensichtlich sind, spätestens wenn Python die meldet. Du solltest öfter mal ausprobieren, ob das was Du bisher programmiert hast zumindest compiliert, oder eben auch läuft.

Insgesamt ist es besser, wenn man Stück für Stück implementiert und immer testet, und erst weiter macht, wenn das bisher implementierte läuft, und nicht ein komplettes Programm runterschreibt und dann erst die Fehler sucht.

Wenn Du einfach mal mit einem Fenster angefangen hättest, wäre Dir viel früher aufgefallen, dass man am Ende die Hauptschleife von `Tkinter` aufrufen muss, damit überhaupt etwas angezeigt wird und sich das Programm nicht sofort wieder beendet.

Dann wäre Dir auch aufgefallen, dass die Zeichenfläche und die Schaltflächen "komisch" positioniert sind und das zwei Schaltflächen auf den selben Gitter-Koordinaten liegen.

Ansonsten solltest Du Dir Sternchen-Importe gar nicht erst angewöhnen.

Von `Tkinter.Tk` darf es in einem Programm immer nur *ein* Exemplar geben. Weitere Fenster, neben dem Hauptfenster kann man mit `Tkinter.Toplevel` erstellen.

Es sollte möglichst keinen Code auf Modulebene geben, ausser Konstanten-, Klassen-, und Funktionsdefinitionenen. Gerade bei GUI-Programmierung verwendet man sonst früher oder später aus versehen oder absichtlich globale Namen, und der Quelltext wird dadurch undurchsichtig und schwer verständlich.
problembär

Hi,

wie konntest Du nur so viel schreiben, ohne zu testen :shock: ?

Man könnte z.B. so anfangen:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import Tkinter 

class TkWin:

    def __init__(self):

        self.brett = Tkinter.Tk(className = "Grafik")
        self.rahmen = Tkinter.Frame(self.brett)
        self.rahmen.pack()
        self.canvas = Tkinter.Canvas(self.rahmen,width = 500,height = 600)
        self.canvas.pack()
        self.rahmen2 = Tkinter.Frame(self.brett)

        btexts = ('Alles löschen',
                  'Linienfarbe',
                  'Füllfarbe',
                  'Dreieck',
                  'Ellipse',
                  'Rechteck',
                  'Quadrat',
                  'Kreis')

        self.buttons = {}

        for i in btexts:

            if i == 'Quadrat':
                self.buttons[i] = Tkinter.Button(self.rahmen2, text = i, command = self.quadratausgabe)
            else:
                self.buttons[i] = Tkinter.Button(self.rahmen2, text = i)

            self.buttons[i].pack(side = Tkinter.LEFT)
            self.rahmen2.pack()

        self.brett.mainloop()

    def quadratausgabe(self):
        pass

TkWin()
Bzgl. des Eingabefensters schau Dir mal Tkinter.Toplevel an, und vor allem Tkinter.Toplevel.wait_window().

Generell sind wir nicht dazu da, Hausaufgaben zu machen:

http://www.python-forum.de/topic-1689.html

Gruß
prettyfunkee
User
Beiträge: 4
Registriert: Sonntag 15. März 2009, 15:17

Vielen, vielen Dank für die Tipps. Ich habe übrigens keine vorgefertigte Lösung für eine Hausaufgabe erwartet, sondern eben nur Tipps! Eigentlich interessiere ich mich sehr für Informatik (, deshalb hab ichs ja auch gewählt), aber oft blick ich nicht richtig durch und ich hab leider niemanden, der mir irgendwas mal richtig erklärt. Und im Unterricht wird vieles nur angeschnitten.... Habt ihr vielleicht noch eine Empfehlung für eine Seite, auf der man Programmieren mit Python durch gute Erklärungen erlernen kann??
Danke nochmal und sorry wegen der Missverständnisse
lg
prettyfunkee
User
Beiträge: 4
Registriert: Sonntag 15. März 2009, 15:17

Ach ja, eins hab ich noch vergessen:

Könnt Ihr mir sagen, ob es überhaupt möglich ist, mit Eingabefeldern (Entry) und Variablen ( ich hatte sie x,y,v genannt) den Wert, den man dort
eingibt auf die Ausgabe zu übertragen? Also ich wollte ja beispielsweise ein Quadrat erstellen lassen. Wenn ich jetzt in die Eingabefelder die Werte für den linken oberen Eckpunkt und die gewünschte Seitenlänge eingebe, wie kann ich das so vernetzen, dass das Quadrat, das nachher erscheint eben diese Position und Größe hat?
BlackJack

@prettyfunkee: Du musst halt die Werte aus den `Entry`\s auslesen, daran denken, dass man aus der GUI Zeichenketten und keine Zahlen bekommt, und dann halt die Funktion zum erzeugen des Quadrats, oder was auch immer Du gerade zeichnen willst, aufrufen.

Wie sieht's denn mit objektorientierter Programmierung aus? Ohne solltest Du das IMHO am besten gleich wieder vergessen.
problembär

@prettyfunkee: Du hast weiß Gott noch genug zu tun.
Auch wenn ich hier mal hinstelle, was Du wohl in etwa machen wolltest:

http://paste.pocoo.org/show/108095/

Jetzt ist es an Dir, das zu verstehen, es zu verbessern und zu erweitern :wink:.

Viele Grüße
prettyfunkee
User
Beiträge: 4
Registriert: Sonntag 15. März 2009, 15:17

Hallo ihr!!
Ich habe mir noch mal mehr Zeit für das Programm genommen und bin schon recht weit gekommen. Danke für alle Tipps!! Nur ein Problem gibt es noch: Ich versuche jetzt schon seit längerem auch die Sache mit der Farbe hinzubiegen.. ohne Erfolg.
Wie die Seitenlängen, Koordinaten usw. hatte ich mir ja gedacht, dass man auch den Hexadezimalcode einer gewünschten Füllfarbe für die geometrische Figur einfach eingibt. Also habe ich "integer " benutzt und an die anderen Variblen angefügt:

f = int (self.entries[3].get())

Dann habe ich bei in der Zeile nach "coords=(..." folgendes geschrieben:

self.canvas.create_polygon(coords, fill=f)

Nur kommt dann, wenn man das Programm laufen lässt und einen Code für die Füllfarbe eingibt die Meldung: unknown und die eingegebene Zahl...

liegt das an integer, oder habe ich die Variable dann später falsch eingebunden??
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Du musst der hex-codierten Farbangabe eine Raute voranstellen.
Warum machst du aus der Eingabe ein int()-Objekt?

Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()
tk.Label(text="Hallo", bg="#ABCDEF").pack()
root.mainloop()
Antworten