Zwei Probleme bei meinem Projekt

Fragen zu Tkinter.
VitroN
User
Beiträge: 16
Registriert: Samstag 12. Januar 2008, 09:58

Zwei Probleme bei meinem Projekt

Beitragvon VitroN » Freitag 18. Januar 2008, 13:27

Hallo,
hab nochmal zwei Probleme bei meinem Projekt...

Problem 1
ich möchte gerne, dass der Benutzer mit Hilfe einer RadioGroup eine Datei auswählt und diese bei Klicken auf den Button importieren kann.

Code: Alles auswählen

from Tkinter import *

class Programm:

    def __init__(self):
        hauptfenster = Tk(className = ' Programm zur Referatefächerverteilung')
        klasse = StringVar()

        self.R8a = Radiobutton(hauptfenster, text='Klasse 8a', value='Klasse 8a.txt', variable=klasse)
        self.R8b = Radiobutton(hauptfenster, text='Klasse 8b', value='Klasse 8b.txt', variable=klasse)
        self.BEinlesen = Button(hauptfenster, width=15, text='Einlesen', command=self.einlesen)

    def einlesen(self):
        f = file('was muss hier rein', 'w')       
 


Was muss ich bei f = file('', 'w') reinschreiben, damit das Programm die Datei sucht bzw den Pfad, der unter der Variablen klasse aus den RadioButtons gespeichert sind?


Problem 2
Kann ich irgendwie zwei Fenster auf der Benutzeroberfläche öffnen? Denke mal es könnte Probleme geben, wenn ich zwei Mainloops habe...

Und wie kann ich das Fenster schließen. Also mit einem Button auf der GUI?

Code: Alles auswählen

    def beenden(self):
        pass
BlackJack

Beitragvon BlackJack » Freitag 18. Januar 2008, 14:52

Zu Problem 1: Du musst das `StringVar`-Objekt an die Instanz binden, dann kannst Du in der `einlesen()`-Methode auch darauf zugreifen. Dafür kannst Du Dir das bei den beiden `RadioButton`\s und dem `Button` sparen. Auf die musst Du ausserhalb der `__init__()` ja nicht mehr zu greifen.

Zu Problem 2: Es darf nur ein Hauptfenster vom Typ `Tk` geben, für weitere Fenster benutzt man `Toplevel`-Objekte.
VitroN
User
Beiträge: 16
Registriert: Samstag 12. Januar 2008, 09:58

Beitragvon VitroN » Freitag 18. Januar 2008, 15:04

Okay, danke...aber leider kann ich damit kaum was anfangen. Hab Python erst ein halbes Jahr in der Schule...

Könntest du mir mal bitte jeweils ein ProgrammBeispiel geben?
Und wie funktioniert das, wenn ich ein Toplevel-Objekt über einen Button aufrufe und wie ist das, wenn ich da z.B. ein Label drauf packen will?


Vielen Danke
VitroN
BlackJack

Beitragvon BlackJack » Freitag 18. Januar 2008, 15:16

In dem Code, der bei Druck auf den Button ausgeführt wird, musst Du halt einfach ein `Toplevel`-Objekt erzeugen und das mit Widgets füllen. Das funktioniert genau wie beim Hauptfenster.
VitroN
User
Beiträge: 16
Registriert: Samstag 12. Januar 2008, 09:58

Beitragvon VitroN » Freitag 18. Januar 2008, 16:35

Und was meinst du bei dem StringVar-Objekt mit an die Instanz binden?
und was genau muss ich dann beim Aufrufen der Datei für den Pfad eingeben?
BlackJack

Beitragvon BlackJack » Freitag 18. Januar 2008, 16:57

Arbeite mal das Python-Tutorial in der Dokumentation durch, oder etwas vergleichbares, bis Du weisst was objektorientierte Programmierung ist und wozu `self` da ist.

Der ausgewählte Pfad ist über die `get()`-Methode des `StringVar`-Objekts verfügbar.
VitroN
User
Beiträge: 16
Registriert: Samstag 12. Januar 2008, 09:58

Beitragvon VitroN » Freitag 18. Januar 2008, 18:13

Sry, wenn ich etwas nerve und mit dumm anstelle, aber irgendwie steig ich da nicht mehr durch...

Also mein Code sieht im Moment so aus:

Code: Alles auswählen

from Tkinter import *

class Programm:

    def __init__(self):
        hauptfenster = Tk(className = ' Programm')
        klasse = StringVar()
         self.R8a = Radiobutton(hauptfenster, text='Klasse 8a', value='Klasse 8a.txt', variable=klasse)
        self.R8b = Radiobutton(hauptfenster, text='Klasse 8b', value='Klasse 8b.txt', variable=klasse)
        self.BEinlesen = Button(hauptfenster, width=15, text='Einlesen', command=self.einlesen)
        self.BBeenden = Button(hauptfenster, width=15, text='Beenden', command=self.beenden)

    def einlesen(self):
        f = file('self.klasse.get()', 'w')
        f.write('verändert')
        f.close()

    def beenden(self):
        hauptfenster.destroy()


Bei dem BeendenButton macht der so wie es jetzt ist nichts und wenn ich self davor schreibe, sagt der mir das es kein hauptfenster gibt :(

Könntest du mir den Code vllt einmal verbessert aufschreiben? Dann kann ich das einfach übernehmen und muss mich nciht mehr abplagen :P
Wäre dir sehr dankbar :D

(Nach Möglichkeit nicht mit import Tkinter as tk.....)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 18. Januar 2008, 19:17

VitroN hat geschrieben:Könntest du mir den Code vllt einmal verbessert aufschreiben? Dann kann ich das einfach übernehmen und muss mich nciht mehr abplagen :P
Wäre dir sehr dankbar :D

Klar kann er das. Aber warum sollte er deine Hausaufgaben machen? Warum nimmst du die Tipps nicht an?

VitroN hat geschrieben:(Nach Möglichkeit nicht mit import Tkinter as tk.....)

Oha, du hast also schon gesehen, wie es "sauber" geht. Warum beharrst du dann, es immer falsch zu machen?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
VitroN
User
Beiträge: 16
Registriert: Samstag 12. Januar 2008, 09:58

Beitragvon VitroN » Samstag 19. Januar 2008, 10:32

Ich hab das halt mit from Tkinter import * gelernt...was ist denn besser daran es mit import Tkinter as tk zu machen?

Ich kann verstehen, wenn ich etwas nerve...aber das sind keine Hausaufgaben oder sowas für die Schule...nur leider lernen wie in der Schule nicht wirklich viel und da ich ich z.B. mit Sachen wie
"Du musst das `StringVar`-Objekt an die Instanz binden, dann kannst Du in der `einlesen()`-Methode auch darauf zugreifen. Dafür kannst Du Dir das bei den beiden `RadioButton`\s und dem `Button` sparen. Auf die musst Du ausserhalb der `__init__()` ja nicht mehr zu greifen."

nichts anfangen kann, wär es schön wenn ich nen kleines Programmierbeispiel hätte
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 19. Januar 2008, 10:46

VitroN hat geschrieben:Ich hab das halt mit from Tkinter import * gelernt...was ist denn besser daran es mit import Tkinter as tk zu machen?

Mit dem Stern-Import holst du dir alle Namen aus dem Tkinter-Modul in dein Modul, das sind etwa 500 verschiedene Namen, die du nie brauchen wirst. Dann kann es noch zu Konflikten kommen, insbesondere zwischen Tk.Image und PILs Image. Außerdem ist es einfacher herauszufinden woher ein Name kommt. Wenn da tk.Frame steht ist das klar. Wenn da Frame steht, weiß man nicht sofort wo der Name herkommt. Er könnte von wo auch immer importiert worden sein.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Beitragvon BlackJack » Samstag 19. Januar 2008, 11:04

@VitroN: Zu dem Zitat: Das sind Grundlagen von objektorientierter Programmierung (OOP). Bevor man die nicht drauf hat, sollte man IMHO noch nicht mit GUIs arbeiten. Beides, OOP und GUIs, sind für sich genommen schon kompliziert genug, und OOP wird bei GUIs eingesetzt, also macht es Sinn sich erst einmal OOP an zu eignen.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder