Python3 und tkinter

Fragen zu Tkinter.
Antworten
Ghillie_Suit
User
Beiträge: 10
Registriert: Dienstag 25. Januar 2011, 15:37

Hallo, ich habe ein Programm mit grafischer benutzeroberfläche geschrieben, nur wenn ich es ausführen will, kommt nur ein
schwarzes Befehlsfenster das sofort wieder verschwindet aber nicht das programm.

Hier ist der code:

Code: Alles auswählen

import tkinter, sys, webbrowser
def internet():
    webbrowser.open("www.google.de")
    True
def end():
    sys.exit(0)
main=tkinter.Tk()


lb=tkinter.Label(main, text="Bitte Eingabe!")
lb.pack()

bend=tkinter.Button(main, text="Auf Wiedersehen", command=end)
bend.pack

binternet=tkinter.Button(main,text="Ich will ins Internet!",command=internet)
binternet.pack

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

1. Deine "pack"-Methoden solltest du auch aufrufen, da fehlen die Klammern.
2. Hast du keine mainloop, also häng mal unten an dein Programm "main.mainloop()" ran.
3. True oben ist unötig
4. sys.exit(0) ist Fehl am Platz, hier durch "main.destroy()" ersetzen.
5. imports von verschiedenen Modulen immer untereinander schreiben
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Da muss ich Xynon1 recht geben, obwohl der mir heute auf den Keks geht :wink: !
Und die Funktion end() ist überflüssig, benutze stattdessen in der Buttondeklaration "command=main.destroy()" ! Damit hat Xynon1 mich auch genervt!

Soll das Programm nur Google öffnen? Wie wäre es mit dem modul os!

Code: Alles auswählen

import os
url="http://google.de"
def main():
    os.cmd("firefox "+url)
main()
Und zur Übersichtlichkeit rate ich dir zwischen [variable]= und =[deklaration] ein Leerzeichen zu machen, also:

Code: Alles auswählen

#WRONG
lb=tkinter.Button(main, text="fail")
#GOOD
lb = tkinter.Button(main, text="hello")
Dadurch entstehen zwar mehr Bytes auf der Festplatte, aber das Programm ist leichter zu lesen. Sieh mal hier:

Code: Alles auswählen

#imports
import socket
#connection details
network="irc.freenode.net"
port=6667
#connect
try:
    irc=socket.socket(socket.AF_INET)
catch:
    print("Fehler bei der Verbindung")
#datatransfer
irc.send("NICK guest4675\r\n")
Besser:

Code: Alles auswählen

#Imports
import socket

#Connection details
network = "irc.freenode.net"
port = 6667

#Connect
try: 
    irc = socket.socket(socket.AF_INET)
catch:
    print("Fehler bei der Verbindung")

#Datentransfer
irc.send("NICK guest4675\r\n")
Das sieht doch viel besser aus, und auch die Kommentare sind übersichtlich! Da hat man auch Bock den Code zu lesen.

Aber ist ja deine Entscheidung. Viel Spass noch in deinem kurzen aber spannenden Programmiererdasein!
LG Maik
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@daemonTutorials: Sag mal: In welcher Sprache programmierst du denn? In Python gibt es jedenfalls weder `os.cmd` noch eine `catch` clause.

Dein "Tipp" `webbrowser` zu ersetzen ist schlecht und nicht aequivalent zum Code des OP.
Bytes sind nun wirklich kein Argument gegen Whitespace, nicht bei Centpreisen pro GB und erst recht nicht, wenn man bedenkt, dass Programme meist so klein sind, dass sie Dateisystem Bloecke komplett ausfuellen und damit sowieso Platz verschwenden. Ziel des ganzen: Behandel es nicht als Argument.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

daemonTutorials hat geschrieben:Da muss ich Xynon1 recht geben, obwohl der mir heute auf den Keks geht
Das bisschen ging dir schon auf den Keks :roll:, war doch noch gar nicht in fahrt gekommen :wink:
daemonTutorials hat geschrieben:Und die Funktion end() ist überflüssig, benutze stattdessen in der Buttondeklaration "command=main.destroy()" ! Damit hat Xynon1 mich auch genervt!
Hier auch nochmal, die Klammern hinter dem "main.destroy" weglassen, (WENN diese an "command" übergeben wird - ist im übrigen hier nicht der Fall), ansonsten wird die Funktion gleich gerufen.
daemonTutorials hat geschrieben:Soll das Programm nur Google öffnen? Wie wäre es mit dem modul os!
Wie cofi schon angemerkt hatte keine gute Idee, da "webbrowser" extra für diesen Zweck gebaut wurde. Überleg mal was bei dir passiert, wenn der jenige keinen Firefox hat. Zudem bekommt man per "os.cmd" auch kein handle auf den Prozess.
Und nur so als Tipp, falls du es noch nicht kennst, diese "Leerzeichenregeln" sind in der Style Guide als PEP8 festgehalten.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Da muss ich euch beiden leider recht geben.
@Xynon1: Ich weiß
@Cofi: Das mit catch ist mir auch aufgefallen, müsste except heißen. Und das mit os und cmd habee ich mir mal aus dem Ärmel geschüttelt. Habe lang nicht mehr programmiert. Müsste mir mal wieder ein Buch anschauen.
LG Maik
BlackJack

@daemonTutorials: Bücher nur anschauen nützt nicht viel -- man sollte sie besser lesen und den Inhalt wenn möglich auch verstehen. Oder zumindest die Dokumentation zu den Modulen und Funktionen die man verwendet sollte man lesen. Noch besser ist es, wenn man etwas ausprobiert bevor man es anderen als Lösung vorschlägt. Dann fallen einem selber "Lösungen" die gar nicht erst kompiliert werden können, schon auf bevor man damit niemandem weiterhilft. ;-)
Antworten