GUI Dateien einbinden/öffnen

Fragen zu Tkinter.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Danke @cofi für Deinen Rat.

Wegen dieses Problems habe ich heute die Version 2.7.6 deinstalliert und (in einen neuen Ordner) 2.7.11 und darüber hinaus auch noch 3.5 installiert. Trotzdem habe ich dieses Problem weiter. Ich habe niemals "webbroser" separat installiert. Trotzdem habe ich versucht, die Datei für diese Modul nach Deiner Empfehlung zu finden. Das hier ist das Ergebnis:

Code: Alles auswählen

C:\Python2>python
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:32:19) [MSC v.1500 32 bit (
Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print webbrowser.___file___
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'webbrowser' is not defined
>>>
Für die Version 3.5 sieht es so aus:

Code: Alles auswählen

C:\Python3>python
Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:16:59) [MSC v.1900 32 bit (In
tel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print (webbrowser.___file___)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'webbrowser' is not defined
>>>
Ich kann mir das nicht erklären, muss aber noch darauf hinweisen, dass zur Zeit zwei zusätzliche Module installiert sind, einmal vlc und dann requests. Letzteres habe ich aber erst installiert, als das Webbrowser-Modul nicht gefunden wurde. Beide Module waren in der Vergangenheit auch installiert und wurden für jeweils ein Testprogramm benötigt. Ich befasse mich zur Zeit nur mit Testprogrammen, um ein Gefühl für Python und dessen Möglichkeiten zu bekommen.

Nach einer Anpassung in der IDE von NetBeans sind übrigens alle meine bisher erstellten Testprogramme lauffähig.

MfG, kodela
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@kodela: Schau mal:

Code: Alles auswählen

Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> webbrowser.__file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'webbrowser' is not defined
>>> import webbrowser
>>> webbrowser.__file__
'/usr/lib/python2.7/webbrowser.pyc'
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Warum denkst du denn, dass die normalen Regeln hier nicht gelten sollten? Ein Name ist erst dann verfuegbar, wenn er importiert oder definiert wurde, wie es auch pillmuncher zeigt.

Planloses de- und reinstallieren kann hier auch nicht helfen, weil das Problem eben - sehr wahrscheinlich - ein eigenes Modul namens "webbrowser" ist. Und am besten probierst du es auch nicht in einer frischen Python-Shell aus, sondern ergaenzt das in dem Programm, das nicht funktioniert.

Zu guter Letzt, da `webbrowser` Teil der Standardbibliothek ist: Behalte die Dokumentation dazu immer griffbereit: https://docs.python.org/2/library/
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @pillmuncher:

Das sieht dann bei mir so aus:

Code: Alles auswählen

C:\Python3\requests-master>python
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:32:19) [MSC v.1500 32 bit (
Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> webbroser.___file___
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'webbroser' is not defined
>>> import webbrowser
>>> webbrowser.___file___
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '___file___'
>>>
Mit 2.7.11 sieht es entsprechend aus:

Code: Alles auswählen

C:\Python2>python
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:32:19) [MSC v.1500 32 bit (
Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import webbrowser
>>> webbrowser.___file___
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '___file___'
>>>
Noch etwas muss ich erwähnen: In meiner Ahnungslosigkeit hatte ich die Skriptdatei ursprünglich webbrowser.py benannt. Das ist aber bereits geändert worden.

Das Modul wird ja gefunden, nur hat es das Attribut "open" nicht. Ich suche jetzt einmal den ganzen Rechner ab, ob eventuell von der ursprünglichen Skriptdatei webbrowser.py irgendwo eine webbrowser.pyc gemacht wurde, die immer noch existiert und auf die zugegriffen wird.

MfG, kodela
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @cofi: hallo @pillmuncher:

Es war so, wie cofi vermutet hat. Ohne dass mir das aufgefallen wäre, wurde von der Skriptdatei auf dem Laufwerk D: in meinem Projekteordner eine compilierte Fassung gespeichert und beim Import von webbrowser auf diese zugegriffen.

Danke für Eure Hilfe, durch die ich der Sache auf den Grund gekommen bin.

MfG, kodela
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Noch was anderes:
kodela hat geschrieben:

Code: Alles auswählen

>>> webbrowser.___file___
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '___file___'
Vergleich mal:

Code: Alles auswählen

webbrowser.___file___
webbrowser.__file__
Special Method Names haben vorne und hinten jeweils zwei Unterstriche, nicht drei.
In specifications, Murphy's Law supersedes Ohm's.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

@pillmuncher:

Danke für Deine Hinweise. Da habe ich ein weiteres Mal geschlampt.

MfG, kodela
goldm4n
User
Beiträge: 12
Registriert: Sonntag 15. November 2015, 12:57

Hey @-all,

ich habe schnell mal eine Frage:
Ich habe eine GUI mit einem Label und zwei Buttons. Ich möchte wenn z.B. der User auf Button1 = "Weiter" klickt, dass sich ein neues leeres Fenster öffnet und das alte sich schließt.
also klar ist das ich ein Funktion definiere wo auf Buttton1 anspring aber weiter weis ich net :(
wie geht das?

Thx
BlackJack

@goldm4n: Das `Tk`-Exemplar, und damit das Hauptfenster, darf man nicht zerstören sondern höchstens unsichtbar machen (`withdraw()`-Methode) und zusätzliche Fenster muss man mit `Toplevel` umsetzen weil es nur ein `Tk`-Exemplar zur gleichen Zeit geben darf. Die Rückruffunktion/-methode für die Schaltfläche müsste also das alte Fenster unsichtbar machen wenn es ein `Tk`-Exemplar ist und das neu Fenster erstellen.

Edit: Und `Button1` ist ein sauschlechter Name. Falsche Schreibweise (Grossbuchstabe), angehängte Nummer, und ein supergenerischer Name. Namen sollen dem Leser verraten was der Wert dahinter bedeutet. So etwas wie `next_button` oder `continue_button` wäre da eher hilfreich als `Button1`.
goldm4n
User
Beiträge: 12
Registriert: Sonntag 15. November 2015, 12:57

Dankeschön!

Okay, das hört sich zimmlich kompliziert an ;)
ich würde auch gerne mein Code ihr preisgeben, aber ich habe das mit der CodeBox immer noch nicht trauf :(
goldm4n
User
Beiträge: 12
Registriert: Sonntag 15. November 2015, 12:57

Code: Alles auswählen

from tkinter import *
import time, sys, random 


master = Tk()
w = Label(master, text="Bereit zu spielen?",
          fg = "light green",
          bg = "dark green",
          font = " Helvetica 16 bold italic").pack()

master.title("MirPro")
master.geometry("300x100")

def weiter():    
    -->open???<--????
knopf1 = Button(master, text="Weiter",command=weiter)
knopf1.pack()


def schließen():    
    exit()
knopf2 = Button(master, text="Schließen!",command=schließen)
knopf2.pack()


def master():
   master = Tk()
   w = Label(master, text="Bereit zu spielen?",
          fg = "light green",
          bg = "dark green",
          font = " Helvetica 16 bold italic").pack()

   master.title("MirPro")
   master.geometry("300x100")
goldm4n
User
Beiträge: 12
Registriert: Sonntag 15. November 2015, 12:57

noch eine andere frage:

ich habe ein Lotto Zahlen Generator versucht, klappt auch alles außer das es das Ergebnis in die shell ausgiebt anstatt im TK Modul.

Code: Alles auswählen

from random import *
from tkinter import *
import time



master = Tk()
w = Label(master, text="Deine Lotto zahlen",
          fg = "light green",
          bg = "dark green",
          font = " Helvetica 16 bold italic").pack()

master.title("MirPro")
master.geometry("300x100")
 

ziehung = []
for i in range(6):
    zahl = randint(1, 49)
    ziehung = ziehung + [zahl]


print (ziehung)


master.mainloop()
Zuletzt geändert von Anonymous am Montag 28. Dezember 2015, 19:11, insgesamt 1-mal geändert.
Grund: Textauszeichnung repariert.
BlackJack

@goldm4n: „klappt auch alles“ ist etwas übertrieben denn ich sehe nicht wo verhindert wird das die gleiche Zahl mehr als einmal gezogen werden kann. Das `random`-Modul kennt dafür eine sehr praktische `sample()`-Funktion.

``ziehung = ziehung + [zahl]`` ist eine ineffiziente Art die Ergebnisse zu sammeln. Listen haben eine `append()`-Methode mit der man an eine bestehenden Liste ein neues Element anhängen kann. Statt immer wieder einzelne Elemente in eine neue Liste zu packen und dann eine weitere Liste zu erstellen in welche die bisherigen Ergebnisse und die Liste mit dem einen neuen Element kopiert werden und dann die beiden “alten“ Listen verworfen werden.

Edit: Von GUI-Programmierung solltest Du vielleicht besser die Finger lassen bis die Grunddatentypen sitzen, Funktionen sinnvoll selbst geschrieben, und dann objektorientierte Programmierung in Grundzügen verstanden wurde. Das braucht man nämlich alles als Voraussetzung.
goldm4n
User
Beiträge: 12
Registriert: Sonntag 15. November 2015, 12:57

Ookay ;)

und wie bekomme ich das Ergebnis in das Tk eingebunden?
muss ich in meinem Fall Master...irgendwas vor print (zahl) so das ich dem Tk sag das es zu ihm gehört?
BlackJack

@goldm4n: Nein, Du müsstest da irgendein Widget erstellen in dem Text dargestellt werden kann und den dann auf den gewünschten Text setzen. Mit `print()` ist da nichts zu wollen, es sei denn Du ersetzt `print()` oder die Standardausgabe und schreibst Code der das dann in einem Widget darstellt. Was aber für diesen Fall unnötig umständlich wäre.
goldm4n
User
Beiträge: 12
Registriert: Sonntag 15. November 2015, 12:57

Okay ich versuche mal mein Glück. Thx
Antworten