Drop-Down Box Zahlen Fehler

Fragen zu Tkinter.
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Hallo sirius3 und wuf,

danke für eure zahlreichen Antworten! Freu mich darüber...
Das das Programm nicht lauffähig ist mir klar, aber es soll ja noch werden... (hoffentlich).
Das folgende hat auch schon unser Kollege daemonTutorials angedeutet:
Code:
stelle1 = stell1 #float(input("Profilwölbung in %: "))
stelle2 = stell2 #float(input("Wölbungsrücklage in 10-%: "))
stelle3 = stell3 #float(input("Profildicke in % (zweistellig): "))
alpha = alpha #float(input("Anstellwinkel alpha[°] = "))
stell1, stell2, stell3, alpha existieren noch nicht!
Durch was soll ich dass denn ersetzten?
Wenn ich es mit dem get_zahl1() ersetzte, dann greift es wieder auf das "A" zurück! "ValueError: invalid literal for int() with base 10: 'A'"!
Genau an dem hänge ich jetzt schon Tage... :(

Für diese Art von Binding gibt es leider auch keine wirklichen Tutorials die mir bekannt sind..?

Grüße und gute Nacht, HTLEst.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Guten Morgen HTLEisenstadt

Bei dieser Zeile:

Code: Alles auswählen

stelle1 = stell1 #float(input("Profilwölbung in %: "))
nehme ich an, dass du den auskommentierten Teil:

Code: Alles auswählen

#float(input("Profilwölbung in %: "))
der Zeile als Tastatureingabe einkommentieren wirst sobald das Skript erste Zeichen von Lauffähigkeit zeigt. Richtig? Also in der Zwischenzeit möchtest du diesen auskommentierten Teil ersetzen durch die Variable:

Code: Alles auswählen

stell1
Damit du aber diese Variable so verwenden kannst muss sie zuerst vorhanden sein und einen Wert zugewiesen bekommen wie folgt:

Code: Alles auswählen

#---------------------------Eingabe des Benutzers-------------------------------
stell1 = 10.0
stell2 = 10.0
stell3 = 10.0
alpha = 100.0

stelle1 = stell1 #float(input("Profilwölbung in %: "))
stelle2 = stell2 #float(input("Wölbungsrücklage in 10-%: "))
stelle3 = stell3 #float(input("Profildicke in % (zweistellig): "))
alpha = alpha #float(input("Anstellwinkel alpha[°] = "))
Oder du kannst die Werte direkt ohne neue Variablen zu kreieren zuweisen wie:

Code: Alles auswählen

#---------------------------Eingabe des Benutzers-------------------------------
stelle1 = 10.0 #float(input("Profilwölbung in %: "))
stelle2 = 10.2 #float(input("Wölbungsrücklage in 10-%: "))
stelle3 = 10.0 #float(input("Profildicke in % (zweistellig): "))
alpha = 100.0 #float(input("Anstellwinkel alpha[°] = "))
Aber dies sind jetzt wirklich Programmierbasics. Da musst du vielleicht nochmals über die Bücher (Tutorials) gehen. :wink:

Der bellende Hund in deinem Skript:

Code: Alles auswählen

Traceback (most recent call last):
File "C:\Users\xxxxxxxxxxxx\Desktop\programm_LH1.py", line 330, in <module>
stelle1 = get_zahl1() #float(input("Profilwölbung in %: "))
File "C:\Users\xxxxxxxxxxxxxx\Desktop\programm_LH1.py", line 23, in get_zahl1
return int(sar.get()[0])
ValueError: invalid literal for int() with base 10: 'A'
Diese Exception könnte entstehen da hier etwas schief läuft:

Code: Alles auswählen

def ok():
    if sar.get() == CHOICE:
        print("Bitte zuerst Profil auswählen!")
        return
Bei mir wirft dies eine Exception, die folgende Warnung enthält:

Code: Alles auswählen

num_splitter_03_01.py:81: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
  if sar.get() == CHOICE:
Da mein Skript:

Code: Alles auswählen

# -*- coding: utf-8 -*-
codiert ist.

Versuchte herauszufinden was hier das Problem ist und ergänzte den Code-Abschnitt mit:

Code: Alles auswählen

 
    print(sar.get(), CHOICE)
zu:

Code: Alles auswählen

    if sar.get() == CHOICE:
        print("Bitte zuerst Profil auswählen!")
        return
    print(sar.get(), CHOICE)
Hiermit wurde die Exception mit Klartext erweitert:

Code: Alles auswählen

num_splitter_03_01.py:81: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
  if sar.get() == CHOICE:
(u'Ausw\xe4hlen', 'Ausw\xc3\xa4hlen')
und zwar mit:

Code: Alles auswählen

(u'Ausw\xe4hlen', 'Ausw\xc3\xa4hlen')
Diese sagt aus, dass der Vergleich:

Code: Alles auswählen

if sar.get() == CHOICE:
in die Hose gehen muss.

Um dieses Problem zu beheben machte ich folgende Änderung:

Code: Alles auswählen

#CHOICE = "Auswählen"
CHOICE = u"Auswählen"
Und siehe da der Hund beruhigte sich.

Hoffe dir hiermit ein wenig weitergeholfen zu haben.

Gruß wuf :wink:
Take it easy Mates!
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Schönen Vormittag wuf,
Bei dieser Zeile:
Code:
stelle1 = stell1 #float(input("Profilwölbung in %: "))
nehme ich an, dass du den auskommentierten Teil:
Code:
#float(input("Profilwölbung in %: "))
der Zeile als Tastatureingabe einkommentieren wirst sobald das Skript erste Zeichen von Lauffähigkeit zeigt. Richtig?
Nein, ich möchte als "stelle1" einfach die vom Benutzer ausgewählte Zahl aus dem Dropdown-Menü übernehmen!? :?
Das heißt, eine Zahl (Integer), mit der ich weiter rechnen kann, die mit dem Drop-Down ausgewählt wird.

Der Benutzer soll sein Profil (z.B. 4415) auswählen, dieses soll dann gesplittet werden und IMMER DIE ERSTE ZAHL soll als stelle1 übernommen werden, die ZWEITE ZAHL als stelle2 etc... :cry:

Tut mir leid wenn ich das wirklich so undeutlich erkläre....

Also im Prinzip etwas ganz simples, dachte ich zumindest?!?
Jedoch ist dann auf einmal stelle1 keine Zahl mehr, sondern entweder ein Wert vom Wort "Auswählen" oder eine Funktion, mit der ich nicht weiterrechnen kann!

Grüße, HTLEst.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo HTLEisenstadt,

weil der Code

Code: Alles auswählen

stelle1 = stell1
usw.
direkt auf Modulebene ist, wird er sofort ausgeführt.
Du mußt das ganze Zeug zum Plotten in eine Funktion schreiben, die erst beim Click auf OK aufgerufen wird. (Siehe mein Posting oben!)

Grüße
Sirius
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Hallo HTLEisenstadt,

weil der Code
Code:
stelle1 = stell1
usw.

direkt auf Modulebene ist, wird er sofort ausgeführt.
Du mußt das ganze Zeug zum Plotten in eine Funktion schreiben, die erst beim Click auf OK aufgerufen wird. (Siehe mein Posting oben!)

Grüße
Sirius
Ahhhh, jetzt hab ichs geschnallt! :) D.h. ich muss das ganze Rechenprogramm in der definition von OK (def ok():) schreiben!??

Finde ich logisch, aber warum bin ich da bitte nicht draufgekommen... :oops:

Grüße und vielen Dank Sirius3!
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

ES FUNKTIONIERT!!!!!!! :D :D :D

Ich kann euch gar nicht sagen, wie sehr mich das freut!! :D

VIELEN VIELEN VIELEN VIELEN Dank an Euch alle!!

Nun werde ich weiterschreiben am Programm...

Grüße, HTLEst.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Am besten nicht alles in ok, sondern definiere eine eigene Funktion

Code: Alles auswählen

def plot(stelle1, stelle2, stelle3, alpha, panel):
    # --------------Umrechnen der Eingaben------------------------------------------
    alpha = alpha*math.pi/180
    f=stelle1/100.
    xf=stelle2/10.
    d=stelle3/100.
    usw.
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Ja so ist das…
Funktionen sind ja dafür da, um eine Funktion bei BEDARF aufzurufen und das willst du ja.

Für Rechenoperationen, Stringoperationen usw. würde ich sowieso immer eine eigene Funktion anlegen, damit mein Hauptcode nicht unnötig lang wird und lesbar bleibt ^^

Tschaui ;)
LG Maik
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Ja vielen vielen Dank!!! :-)

- Ist es in Python auch möglich mehrere Digramme gleichzeitig auszugeben? Ich möchte gerne mit Checkbuttons Diagramme anzeigen lassen. Ist es möglich, dass sich mehrere Fenster (in jedem Fenster ein Diagramm) gleichzeitig öffnen?
- Zudem die Frage an euch: Was emphelt Ihr für die Ausgabe der Diagramme? MATHPLOT, GNUPLOT etc...? Ich möchte nur Verteilungen in den Diagrammen platzieren (2D)... Auch wenn möglich, dass alles in einer Datei ist und ich nicht neben dem Hauptprogramm noch eine Datei benötige auf die ich zugreifen muss, dass das Diagramm angezeigt wird.

Grüße, HTLEst.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

HTLEisenstadt hat geschrieben:Ist es möglich, dass sich mehrere Fenster (in jedem Fenster ein Diagramm) gleichzeitig öffnen?
Kein Problem:

Code: Alles auswählen

#!/usr/bin/env python
# coding: UTF-8

try:
    #~~ For Python 2.x
    import Tkinter as tk
except ImportError:
    #~~ For Python 3.x
    import tkinter as tk

APP_WIN_XPOS = 50
APP_WIN_YPOS = 50
APP_WIN_WIDTH = 400
APP_WIN_HEIGHT = 400
APP_WIN_TITLE = 'Tk App-Template'
APP_BACK_GND = 'palegoldenrod'

class App(object):
    
    def __init__(self):
        
        self.win = tk.Tk()
        self.win.geometry('+{0}+{1}'.format(APP_WIN_XPOS, APP_WIN_YPOS))
        #self.win.geometry('{0}x{1}'.format(APP_WIN_WIDTH, APP_WIN_HEIGHT))
        self.win.protocol("WM_DELETE_WINDOW", self.close)
        self.win.config(bg=APP_BACK_GND)
    
    def create_top_win(self):
        
        top_win = tk.Toplevel()
        top_win.geometry('{0}x{1}+{2}+{3}'.format(250, 100, self.top_win_xpos,
            self.top_win_ypos))
        top_win.update_idletasks()
        self.top_win_collector.append(top_win)
        
            
        self.top_win_xpos += self.top_win_xyoff
        self.top_win_ypos += self.top_win_xyoff
        top_win.title('Toplevel-Fenster-{0}'.format(len(self.top_win_collector)))
        top_win.update_idletasks()
        
    def close(self):
        self.win.destroy()
        print ("Shut down application")

    def run(self):
        self.win.mainloop()
        
app = App()
app.win.title("Toplevel-Generator")
app.win.withdraw()

app.top_win_xpos = 300
app.top_win_ypos = APP_WIN_YPOS
app.top_win_xyoff = 20

app.top_win_collector = list()

# Erstelle 10 Toplevel-Fenster
[app.create_top_win() for top_win in range(10)]

# Erstelle weitere Toplevel-Fenster
tk.Button(app.win, text='Erstelle weiteres Fester', command=app.create_top_win
    ).pack()
app.win.deiconify()
app.win.update_idletasks()

app.run()
Gruß wuf :wink:
Take it easy Mates!
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Hallo wuf,

vielen Dank!
Hast du auch einen Link für ein Tutorial? :-)

Ist das ganze auch dann möglich:
Ich habe z.B. 10 Checkbutton definiert. Jetzt sollen sich je nach ausgewählten Checkbuttons verschieden viele Fenster mit Diagrammen öffnen! Also hat ein Checkbutton der Wert 1, soll das Fenster öffnen, hat er 0, dann soll sich kein demensprechendes Fenster öffnen!

Grüße HTLEst.
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Ich glaube Checkbuttons sind für diesen Zweck ungeeignet. Versuche es mit Radiobuttons oder eine Spinbox:
http://effbot.org/tkinterbook/spinbox.htm

Und Variablen und "Values" abfragen solltest du ja bereits in deinem Code an diversen Stellen gesehen haben. Und IF-ELSE und co. ja auch…

LG Maik
LG Maik
Antworten