Befreundet und vollkommene zahlen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
beuvo

hallo ich habe mal eine frage an euch habe ein Gui geschrieben welches prüft, ob eine zahl befreundet bzw. befreundet und vollkommen ist.

jetzt hätte ich gerne, das ich den algorythmus implementiere, also nicht mehr in der gleiche py datei stehen habe bekomme es aber leider nicht hin.

könnt ihr mir vll helfen?


hier ist einmal mein GUI - mit dem algorythmus

Code: Alles auswählen

# # # # # # # # # # # # # # # # # # # # # # # #
# Befreundet und Vollkommen GUI               #
#                                             #
# Version: 1.0                                #
# Beginn: 09.09.2005                          #
# # # # # # # # # # # # # # # # # # # # # # # #

#__doc__
"""Befreundet und Vollkommen

Um das Programm zu starten einfach die gewuenschte
Obergrenze in das Schreibfeld eingeben und dann ENTER
druecken oder STRG+B. Falls Sie alles Angezeigt haben
wollen, also Be/Vo Werte, Befreundete Werte und
Primzahlen, dann muessen Sie vor der Berechnung ein
Haeckschen bei Alle Werte zeigen setzen.

Funktionen:

STRG+B  Berechnung staten
STRG+C  Inhalt des ListCtrl loeschen
STRG+A  Berechnung anhalten
STRG+F  Berechnung fortsetzen
STRG+Q  Programm beenden


"""

import wx

#########################
#         ID's          #
#########################

ID_DATEIMENU_1  = wx.NewId()
ID_DATEIMENU_2  = wx.NewId()
ID_DATEIMENU_3  = wx.NewId()
ID_DATEIMENU_4  = wx.NewId()
ID_DATEIMENU_5  = wx.NewId()
ID_HILFEMENU_1  = wx.NewId()
ID_TOOLBAR_1    = wx.NewId()
ID_SB           = wx.NewId()
ID_TC           = wx.NewId()
ID_CB           = wx.NewId()
ID_LC           = wx.NewId()

class MyFrame(wx.Frame):
    ''' Hauptfenster '''
    def __init__(self):
        ''' Inhalte des Fensters '''
        # Fenster
        wx.Frame.__init__(self, None, -1, 'Version 1.0.20050909', wx.DefaultPosition, wx.Size(713,480))

        # Atribute
        self.zahl = 100         #Obergrenze
        self.berechne = False   #Wird gerechnet (True) oder nicht (False)?
        self.cache = None       #Speicherplatz der noetigen Daten falls forgesetzt werden will.
        self.fort = False       #Wird fortgesetzt (True) oder nicht (False)?
        self.status = False     #Soll alles angezeigt werden (True) oder nicht (False)?

        # Methoden
        self.createMenubar()    #Menubar wird erzeugt
        self.createToolbar()    #Toolbar wird erzeugt
        self.createListctrl()   #ListCtrl wird erzeugt

    # -------------------------------------------------------------------------------------

    #########################
    #        Menubar        #
    #########################

    def createMenubar(self):
        ''' Erzeugt eine Menubar mit den Menus "Datei" und "Hilfe".
            Die Untermenus bei Datei sind:
            -Berechnung starten
            -Loesche Alles
            -Anhalten
            -Fortsetzen
            -Beenden
            Die Untermenus bei Hilfe:
            -Ueber '''
        self.menubar = wx.MenuBar()  #Eine Menubar wird erzeugt

        menu = wx.Menu()             #Ein Menupunkt wird erzeugt
        menu.Append(ID_DATEIMENU_1, 'Berechnung &starten\tCTRL+B', 'Berechnung starten') #Ein Menuunterpunkt wird erzeugt
        menu.Append(ID_DATEIMENU_2, '&Loesche Inhalt\tCTRL+C', 'Loesche Inhalt')
        menu.Append(ID_DATEIMENU_3, '&Anhalten\tCTRL+A', 'Anhalten')
        menu.Append(ID_DATEIMENU_4, '&Fortsetzen\tCTRL+F', 'Fortsetzen')
        menu.Append(ID_DATEIMENU_5, '&Beenden\tCTRL+Q', 'Beenden')
        self.menubar.Append(menu, '&Datei') #Bindet den Menupunkt mit den Menuunterpunkten an die Menubar

        menu = wx.Menu()
        menu.Append(ID_HILFEMENU_1, '&Ueber\tF1', 'Info')
        self.menubar.Append(menu, '&Hilfe')
        self.SetMenuBar(self.menubar)

    # -------------------------------------------------------------------------------------

    #########################
    #        Toolbar        #
    #########################

    def createToolbar(self):
        ''' Es wird eine Toolbar erzeugt die einen statischen Text hat,
            ein TextCtrl und eine CheckBox beinhaltet. Noch wird eine Statusbar erzeugt '''
        self.tb = self.CreateToolBar()

        #TextCtrl
        self.textctrl = wx.TextCtrl(self.tb, ID_TC, '100', size = (150, -1), pos = (70, 3))
        self.tb.AddControl(self.textctrl)

        #StaticText
        self.text = wx.StaticText(self.tb, -1, "Obergrenze", (5,5))

        #Statusbar
        self.CreateStatusBar(1)

        #CheckBox
        self.cb = wx.CheckBox(self.tb, ID_CB, 'Alle Werte zeigen', (300,5))

    # -------------------------------------------------------------------------------------

    #########################
    #        ListCtrl       #
    #########################

    def createListctrl(self):
        ''' Erzeugt wir ein ListCtrl mit 5 Spalten '''
        self.list = wx.ListCtrl(self, ID_LC, style = wx.LC_REPORT | wx.LC_HRULES | wx.LC_VRULES )
        self.list.InsertColumn(0, 'Zahl', width = 100)
        self.list.InsertColumn(2, 'Summe1', width = 200)
        self.list.InsertColumn(3, 'Summe2', width = 200)
        self.list.InsertColumn(4, 'Status', width = 200)

    # -------------------------------------------------------------------------------------

    #########################
    #      Bindungen        #
    #########################

        self.Bind(wx.EVT_MENU, self.onBerechne, id = ID_DATEIMENU_1) #Bindet die Berechnung mit dem Menuunterpunkt 'Berechnung starten'
        self.Bind(wx.EVT_MENU, self.clearScr, id = ID_DATEIMENU_2) #Bindet das loeschen des Inhaltes des TextCtrl mit dem Menuunterpunkt 'Loesche Inhalt'
        self.Bind(wx.EVT_MENU, self.onStop, id = ID_DATEIMENU_3) #Bindet das Anhalten der Berechnung mit dem Menuunterpunkt 'Anhalten'
        self.Bind(wx.EVT_MENU, self.onFort, id = ID_DATEIMENU_4) #Bindet das Fortsetzen der Berechnung mit dem Menuunterpunkt 'Fortsetzen'
        self.Bind(wx.EVT_MENU, self.onBeenden, id = ID_DATEIMENU_5) #Bindet das Schliessen des Fensters mit dem Menuunterpunkt 'Beenden'
        self.Bind(wx.EVT_CLOSE, self.onBeenden) #Bindet den Schliessenbutton mit dem Handler 'onBeenden'
        self.Bind(wx.EVT_MENU, self.onHilfe, id = ID_HILFEMENU_1) #Bindet den Aufruf einer Messagebox mit dem Menuunterpunkt 'Ueber'
        self.Bind(wx.EVT_TEXT, self.onTextCtrl, id = ID_TC) #Bindet das TextCtrl mit der Ueberpruefung nach Buchstaben
        self.Bind(wx.EVT_TEXT_ENTER, self.onBerechne, id = ID_TC) #Bindet die Aktivierung des Knopfes ENTER mit dem Start der Berechnung
        self.Bind(wx.EVT_CHECKBOX, self.onCheckBox, id = ID_CB) #Bindet die Aktivierung der CheckBox mit dem Handler onCheckBox
        self.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.deleteItem, id = ID_LC) #Bindet die Aktivierung der rechten Maustaste mit dem loeschen einer Zeile

    # -------------------------------------------------------------------------------------

    #########################
    #        Handler        #
    #########################

    def onTextCtrl(self, event):
        ''' Ueberprueft was der Benutzer eingibt. Durch das Event wx.EVT_TEXT wird bei Eingabe
            eines Zeichens in dem TextCtrl-Feld direkt ein Ueberpruefung gestartet. Falls Buchstaben
            eingegeben werden, wird ein MassageDialog geworfen '''
        try:
            self.pruefe = event.GetString()   #Holt den Inhalt des TextCtrl
            for i in range(len(self.pruefe)): #Ueberprueft jedes Zeichen nach
                int(self.pruefe[i])           #einem Buchstaben oder einem Sonderzeichen

            self.zahl = self.pruefe           #Der Obergrenze wird die eingegebene Zahl uebergeben

        except:
            self.textctrl.SetValue(str(self.zahl)) #Setzt ein das TextCtrl den vorigen Wert ein
            dlg = wx.MessageDialog(self, 'Bitte nur Zahlen eingeben!', "powered by wxPython",
            wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()

    # -------------------------------------------------------------------------------------

    def onBerechne(self, event):
        ''' Wenn der Benutzer im TextCtrl Enter drueckt, dann wird das Event
            wx.EVT_TEXT_ENTER ausgeloest und die Berechnung startet '''
        if not(self.berechne):                                   #Falls der Benutzer waehrend der Berechnung im TextCtrl Enter
            try:                                                 #drueckt oder auf Berechnung starten geht, wird der Berechnung
                self.berechnen(self.status, obergrenze = self.zahl) #angehalten. Wenn der Benutzer dann wieder Enter drueckt oder
            except:                                                #auf Berechnung starten geht, dann wird neu gerechnet.
                self.textctrl.SetValue(str(self.zahl))
                dlg = wx.MessageDialog(self, 'Bitte geben Sie eine Zahl ein!', "powered by wxPython",
                wx.OK | wx.ICON_ERROR)
                dlg.ShowModal()
        else:
            self.berechne = False
            self.SetStatusText('Berechnung angehalten', 0)

    # -------------------------------------------------------------------------------------

    def clearScr(self, event):
        ''' Der Inhalt des ListCtrl wird geloescht '''
        if self.berechne: #Der Benutzer kann waehrend der Berechnung nicht die Liste loeschen
            pass
        else:
            self.list.DeleteAllItems()
            self.SetStatusText('Inhalt geloescht', 0)

    # -------------------------------------------------------------------------------------

    def onCheckBox(self, event):
        ''' Der Variablenen self.status wird Ture oder False zugewiesen. '''
        if self.cb.GetValue():
            self.status = True
            self.SetStatusText('Zeige alles', 0)
        else:
            self.status = False
            self.SetStatusText('Zeige nicht alles', 0)

    # -------------------------------------------------------------------------------------

    def deleteItem(self, event):
        ''' Eine Zeile wird geloescht, wenn der Benutzer auf eine Zeile
            geht und die rechte Maustaste betaetigt. Dabei wird das Event
            wx.EVT_LIST_ITEM_RIGHT_CLICK ausgeloest. '''
        if self.berechne: #Der Benutzer kann waehrend der Berechnung keine Zeile loeschen
            pass
        else:
            zeile = event.m_itemIndex
            self.list.DeleteItem(zeile)
            self.SetStatusText('Zeile %d geloescht' %(zeile), 0)

    # -------------------------------------------------------------------------------------

    def onStop(self, event):
        ''' Der Algorithmus wird angehalten und die Momentanwerte werden
            in der Varibalen self.cache gespeichert. '''
        self.berechne = False
        self.SetStatusText('Berechnung angehalten', 0)

    # -------------------------------------------------------------------------------------

    def onHilfe(self, event):
        ''' Es wird die Hilfe aufgerufen, wenn der Benutzer den Menuunterpunkt "Ueber" betaetigt '''
        dlg = wx.MessageDialog(self, __doc__, "powered by wxPython", wx.OK | wx.ICON_INFORMATION)
        dlg.ShowModal()

    # -------------------------------------------------------------------------------------

    def onBeenden(self, event):
        ''' Das Programm wird beendet '''
        self.berechne = False
        self.Destroy()

    # -------------------------------------------------------------------------------------

    def onFort(self, event):
        ''' Wenn der Benutzer auf den Menuunterpunkt "Fortsetzen" klickt, dann
            werden die Momentanwerte in self.cache der Methode self.berechnen
            uebergeben und die Berechnung faengt da an, wo angehalten wurde. '''
        try:
            if not(self.berechne):
                self.fort = True
                self.berechnen(self.cache[0], self.cache[1], self.cache[2], self.cache[3])
            else:
                pass
        except:
            pass
    # -------------------------------------------------------------------------------------

    ###########################
    #Befreundet und Vollkommen#
    ###########################

    def berechnen(self, alleszeigen = False, aktuellezahl = 1, zeile = 0, obergrenze = 100):
        ''' In der Methode befindet sich der Algorithmus von Befreundet und Vollkommen.
            Alleszeigen entscheidet ob alle Werte angezeit werden sollen oder nicht.
            Aktuellezahl ist die Zahl, die gerade berechnet wird. Die Variable Zeile sagt
            aus in welcher Zeile geschrieben wird. Obergrenze ist das Limit der Berechnung.  '''

        self.berechne = True

        if self.fort: #Falls der Benutzer auf Fortsetzen geht, bleiben die vorigen Werte erhalten
            pass      #und werden nicht geloescht.
        else:
            self.list.DeleteAllItems()

        while aktuellezahl <= int(obergrenze):
            if not(self.berechne): #Ist self.berechne auf False wird die Berechnung angehalten.
                self.cache = (self.status, aktuellezahl, zeile, self.zahl)
                break
            self.SetStatusText('Aktueller Durchlauf: ' + str(aktuellezahl), 0) #Der momentane Durchlauf wird angezeigt
            summe1 = 0 #Ermittlung von Summe 1
            teiler1 = 1
            while teiler1 <= aktuellezahl / 2:
                if aktuellezahl % teiler1 == 0 :
                    summe1 = summe1 + teiler1
                teiler1 = teiler1 + 1
            summe2 = 0 #Ermittlung von Summe 2
            teiler2 = 1

            while teiler2 <= summe1 / 2:
                if summe1 % teiler2 == 0 :
                    summe2 = summe2 + teiler2
                teiler2 = teiler2 + 1

            if summe1 == summe2 and summe2 == aktuellezahl: #Wenn summe1 gleich summe2 und summe2 gleich aktuellezahl ist, dann ist die aktuellezahl befreundet und vollkommen
                self.list.InsertStringItem(zeile, str(aktuellezahl))
                self.list.SetStringItem(zeile, 1, str(summe1))
                self.list.SetStringItem(zeile, 2, str(summe2))
                self.list.SetStringItem(zeile, 3, "Befreundet und Vollkommen")
                self.list.SetItemTextColour(zeile, wx.Colour(255,0,0))
                zeile += 1

            elif summe2 == aktuellezahl: #Wenn summe2 gleich aktuellezahl ist, dann ist die aktuellezahl befreundet
                self.list.InsertStringItem(zeile, str(aktuellezahl))
                self.list.SetStringItem(zeile, 1, str(summe1))
                self.list.SetStringItem(zeile, 2, str(summe2))
                self.list.SetStringItem(zeile, 3, "Befreundet")
                self.list.SetItemTextColour(zeile, wx.Colour(0,0,255))
                zeile += 1

            else:
                if alleszeigen:
                    self.list.InsertStringItem(zeile, str(aktuellezahl))
                    self.list.SetStringItem(zeile, 1, str(summe1))
                    self.list.SetStringItem(zeile, 2, str(summe2))
                    if summe1 == 1: #Wenn summe1 gleich 1 ist, dann ist die aktuellezahl eine Primzahl
                        self.list.SetStringItem(zeile, 3, 'Primzahl' )
                        self.list.SetItemTextColour(zeile, wx.Colour(100,50,150))
                    zeile  += 1

            wx.SafeYield(self) #Waehrend der Berechnung ist es noch moeglich andere Funktionen zu aktivieren
            aktuellezahl  += 1
        self.berechne = False
        self.fort = False

    # -------------------------------------------------------------------------------------

###########################
#     Hauptprogramm       #
###########################

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame()
        frame.Show(True)
        return True

if (__name__ == '__main__'):

    app = MyApp(False)
    app.MainLoop()
Edit (Leonidas): Code in Python-Tags gesetzt.
beuvo

hier habe ich jetzt nur noch den algorythmus.

Code: Alles auswählen

import sys

class Befreundet:

    def __init__(self):
        self.summe1= 0
        self.summe2= 0

    def berechneZahlen(self,aktuellezahl):
            self.summe1 = 0
            self.summe2 = 0

            # summe 1 ermitteln
            teiler1 = 1
            while teiler1 <= aktuellezahl/2:
                if aktuelle_zahl%teiler1 == 0 :
                    self.summe1 += teiler1
                teiler1 += 1

            # summe 2 ermitteln
            teiler2 = 1
            while teiler2 <= self.summe1/2 :
                if self.summe1%teiler2 == 0 :
                    self.summe2 += teiler2
                teiler2 += 1

            # Auswertung
            eigenschaft = ""
            if aktuellezahl == self.summe2:
                eigenschaft = "befreundet"
            if aktuelle_zahl == self.summe1:
                eigenschaft = eigenschaft + " und vollkommen"

            else:
                eigenschaft = "die Zahl ist weder befreundet noch vollkommen"

            return (aktuellezahl, self.summe1 ,self.summe2 , eigenschaft)

if __name__ == '__main__':

#    for i in range(int(sys.argv[1])+1):
    a = Befreundet()
    i=0
    eingabe=int(raw_input("Bitte geben Sie eine Zahl ein: "))
    while i < eingabe:

        b = a.berechneZahlen(i)
        print b
        i+=1

was muss ich jetzt genau im gui verändern?
bitte helft mir damit ich in meinen nächsten programmen weiss was ich zu tun habe

Edit (Leonidas): Code in Python-Tags gesetzt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

beuvo hat geschrieben:was muss ich jetzt genau im gui verändern?
bitte helft mir damit ich in meinen nächsten programmen weiss was ich zu tun habe
Wenn du das Programm selbst geschrieben hast, warum ist dass denn ein Problem für dich? Oder ist das eine Hausaufgabe? Du weißt ja sicher, was wir zum Thema Hausaufgeben beschlossen haben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
beuvo

ne das ist keine hausaufgabe.
hausaufgabe war es das programm soweit fertig zu machen, dass es als gui läuft.
nur ersten würde es mich interessieren und zweitens möchte und sollte ich es bei meinen nächsten programmen machen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Man, wenn das von eurem Lehrer geschieben wurde, dann würde ich den Lehrer wechseln. Das Programm hat so einen grausigen Aufbau, man kann es in die Tonne treten: die # -------- kommentare, die Box Kommentare und schlimm waren auch die Kommentare, die in der gleichen Zeile wie der Code ist. Daraus resulieren dann Zeilen, die oftmals über 120 Zeichen lang sind! Mal ganz von den trys abgesehen, welche einfach mal alle Exceptions fangen :evil: Und von Python Style Guide wohl auch noch nie gehört: viel zu viele Leereichen (besonders zwischen zuweisungen, über formatierte Docstrings. Hilfe!

Etwas aufgeräumter (jedoch trotzdem nichts auf das man stolz sein könnte):

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: latin-1 -*-
"""Befreundet und Vollkommen

Um das Programm zu starten einfach die gewuenschte
Obergrenze in das Schreibfeld eingeben und dann ENTER
druecken oder STRG+B. Falls Sie alles Angezeigt haben
wollen, also Be/Vo Werte, Befreundete Werte und
Primzahlen, dann muessen Sie vor der Berechnung ein
Haeckschen bei Alle Werte zeigen setzen.

Funktionen:

STRG+B  Berechnung staten
STRG+C  Inhalt des ListCtrl loeschen
STRG+A  Berechnung anhalten
STRG+F  Berechnung fortsetzen
STRG+Q  Programm beenden


"""

import wx
import befr_alg

ID_DATEIMENU_1 = wx.NewId()
ID_DATEIMENU_2 = wx.NewId()
ID_DATEIMENU_3 = wx.NewId()
ID_DATEIMENU_4 = wx.NewId()
ID_DATEIMENU_5 = wx.NewId()
ID_HILFEMENU_1 = wx.NewId()
ID_TOOLBAR_1 = wx.NewId()
ID_SB = wx.NewId()
ID_TC = wx.NewId()
ID_CB = wx.NewId()
ID_LC = wx.NewId()

class MyFrame(wx.Frame):
    ''' Hauptfenster '''
    def __init__(self):
        """Inhalte des Fensters"""
        # Fenster
        wx.Frame.__init__(self, None, -1, 'Version 1.0.20050909', wx.DefaultPosition, wx.Size(713,480))

        # Atribute
        #Obergrenze
        self.zahl = 100         
        #Wird gerechnet (True) oder nicht (False)?
        self.berechne = False
        #Speicherplatz der noetigen Daten falls forgesetzt werden will.
        self.cache = None
        #Wird fortgesetzt (True) oder nicht (False)?
        self.fort = False
        #Soll alles angezeigt werden (True) oder nicht (False)?
        self.status = False

        # Methoden
        #Menubar wird erzeugt
        self.createMenubar()   
        #Toolbar wird erzeugt        
        self.createToolbar()  
        #ListCtrl wird erzeugt        
        self.createListctrl()   

    def createMenubar(self):
        """Erzeugt eine Menubar mit den Menus "Datei" und "Hilfe".
        Die Untermenus bei Datei sind:
         - Berechnung starten
         - Loesche Alles
         - Anhalten
         - Fortsetzen
         - Beenden
        Die Untermenus bei Hilfe:
         - Ueber"""
        #Eine Menubar wird erzeugt
        self.menubar = wx.MenuBar() 

        #Ein Menupunkt wird erzeugt
        menu = wx.Menu()
        #Ein Menuunterpunkt wird erzeugt
        menu.Append(ID_DATEIMENU_1, 'Berechnung &starten\tCTRL+B', 'Berechnung starten') 
        menu.Append(ID_DATEIMENU_2, '&Loesche Inhalt\tCTRL+C', 'Loesche Inhalt')
        menu.Append(ID_DATEIMENU_3, '&Anhalten\tCTRL+A', 'Anhalten')
        menu.Append(ID_DATEIMENU_4, '&Fortsetzen\tCTRL+F', 'Fortsetzen')
        menu.Append(ID_DATEIMENU_5, '&Beenden\tCTRL+Q', 'Beenden')
        #Bindet den Menupunkt mit den Menuunterpunkten an die Menubar
        self.menubar.Append(menu, '&Datei') 

        menu = wx.Menu()
        menu.Append(ID_HILFEMENU_1, '&Ueber\tF1', 'Info')
        self.menubar.Append(menu, '&Hilfe')
        self.SetMenuBar(self.menubar)

    def createToolbar(self):
        """Es wird eine Toolbar erzeugt die einen statischen Text hat,
        ein TextCtrl und eine CheckBox beinhaltet. Noch wird eine Statusbar erzeugt"""
        self.tb = self.CreateToolBar()

        #TextCtrl
        self.textctrl = wx.TextCtrl(self.tb, ID_TC, '100', size = (150, -1), pos = (70, 3))
        self.tb.AddControl(self.textctrl)

        #StaticText
        self.text = wx.StaticText(self.tb, -1, "Obergrenze", (5,5))

        #Statusbar
        self.CreateStatusBar(1)

        #CheckBox
        self.cb = wx.CheckBox(self.tb, ID_CB, 'Alle Werte zeigen', (300,5))

    def createListctrl(self):
        ''' Erzeugt wir ein ListCtrl mit 5 Spalten '''
        self.list = wx.ListCtrl(self, ID_LC, style = wx.LC_REPORT | wx.LC_HRULES | wx.LC_VRULES )
        self.list.InsertColumn(0, 'Zahl', width = 100)
        self.list.InsertColumn(2, 'Summe1', width = 200)
        self.list.InsertColumn(3, 'Summe2', width = 200)
        self.list.InsertColumn(4, 'Status', width = 200)

        #Bindet die Berechnung mit dem Menuunterpunkt 'Berechnung starten'
        self.Bind(wx.EVT_MENU, self.onBerechne, id = ID_DATEIMENU_1)
        #Bindet das loeschen des Inhaltes des TextCtrl mit dem Menuunterpunkt 'Loesche Inhalt'
        self.Bind(wx.EVT_MENU, self.clearScr, id = ID_DATEIMENU_2)
        #Bindet das Anhalten der Berechnung mit dem Menuunterpunkt 'Anhalten'        
        self.Bind(wx.EVT_MENU, self.onStop, id = ID_DATEIMENU_3) 
        #Bindet das Fortsetzen der Berechnung mit dem Menuunterpunkt 'Fortsetzen'
        self.Bind(wx.EVT_MENU, self.onFort, id = ID_DATEIMENU_4)
        #Bindet das Schliessen des Fensters mit dem Menuunterpunkt 'Beenden'
        self.Bind(wx.EVT_MENU, self.onBeenden, id = ID_DATEIMENU_5) 
        #Bindet den Schliessenbutton mit dem Handler 'onBeenden'
        self.Bind(wx.EVT_CLOSE, self.onBeenden) 
        #Bindet den Aufruf einer Messagebox mit dem Menuunterpunkt 'Ueber'
        self.Bind(wx.EVT_MENU, self.onHilfe, id = ID_HILFEMENU_1) 
        #Bindet das TextCtrl mit der Ueberpruefung nach Buchstaben
        self.Bind(wx.EVT_TEXT, self.onTextCtrl, id = ID_TC) 
        #Bindet die Aktivierung des Knopfes ENTER mit dem Start der Berechnung
        self.Bind(wx.EVT_TEXT_ENTER, self.onBerechne, id = ID_TC) 
        #Bindet die Aktivierung der CheckBox mit dem Handler onCheckBox
        self.Bind(wx.EVT_CHECKBOX, self.onCheckBox, id = ID_CB) 
        #Bindet die Aktivierung der rechten Maustaste mit dem loeschen einer Zeile
        self.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.deleteItem, id = ID_LC) 

    def onTextCtrl(self, event):
        """Ueberprueft was der Benutzer eingibt. Durch das Event wx.EVT_TEXT wird bei Eingabe
        eines Zeichens in dem TextCtrl-Feld direkt ein Ueberpruefung gestartet. Falls Buchstaben
        eingegeben werden, wird ein MassageDialog geworfen"""
        try:
            #Holt den Inhalt des TextCtrl
            self.pruefe = event.GetString()
            #Ueberprueft jedes Zeichen nach
            #einem Buchstaben oder einem Sonderzeichen
            for i in range(len(self.pruefe)): 
                int(self.pruefe[i])           
                
            #Der Obergrenze wird die eingegebene Zahl uebergeben
            self.zahl = self.pruefe           

        except:
            #Setzt ein das TextCtrl den vorigen Wert ein
            self.textctrl.SetValue(str(self.zahl))
            dlg = wx.MessageDialog(self, 'Bitte nur Zahlen eingeben!', "powered by wxPython",
            wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()

    def onBerechne(self, event):
        """Wenn der Benutzer im TextCtrl Enter drueckt, dann wird das Event
        wx.EVT_TEXT_ENTER ausgeloest und die Berechnung startet"""
        if not(self.berechne):
            self.berechnen(self.status, obergrenze = self.zahl)
        else:
            self.berechne = False
            self.SetStatusText('Berechnung angehalten', 0)

    def clearScr(self, event):
        """Der Inhalt des ListCtrl wird geloescht"""
        #Der Benutzer kann waehrend der Berechnung nicht die Liste loeschen
        if self.berechne:
            pass
        else:
            self.list.DeleteAllItems()
            self.SetStatusText('Inhalt geloescht', 0)

    def onCheckBox(self, event):
        """Der Variablenen self.status wird Ture oder False zugewiesen."""
        if self.cb.GetValue():
            self.status = True
            self.SetStatusText('Zeige alles', 0)
        else:
            self.status = False
            self.SetStatusText('Zeige nicht alles', 0)

    def deleteItem(self, event):
        """Eine Zeile wird geloescht, wenn der Benutzer auf eine Zeile
        geht und die rechte Maustaste betaetigt. Dabei wird das Event
        wx.EVT_LIST_ITEM_RIGHT_CLICK ausgeloest."""
        #Der Benutzer kann waehrend der Berechnung keine Zeile loeschen
        if not self.berechne:
            zeile = event.m_itemIndex
            self.list.DeleteItem(zeile)
            self.SetStatusText('Zeile %d geloescht' %(zeile), 0)

    def onStop(self, event):
        """Der Algorithmus wird angehalten und die Momentanwerte werden
        in der Varibalen self.cache gespeichert."""
        self.berechne = False
        self.SetStatusText('Berechnung angehalten', 0)

    def onHilfe(self, event):
        """Es wird die Hilfe aufgerufen, wenn der Benutzer den Menuunterpunkt "Ueber" betaetigt"""
        dlg = wx.MessageDialog(self, __doc__, "powered by wxPython", wx.OK | wx.ICON_INFORMATION)
        dlg.ShowModal()

    def onBeenden(self, event):
        """Das Programm wird beendet"""
        self.berechne = False
        self.Destroy()

    def onFort(self, event):
        """Wenn der Benutzer auf den Menuunterpunkt "Fortsetzen" klickt, dann
        werden die Momentanwerte in self.cache der Methode self.berechnen
        uebergeben und die Berechnung faengt da an, wo angehalten wurde."""
        try:
            if not(self.berechne):
                self.fort = True
                self.berechnen(self.cache[0], self.cache[1], self.cache[2], self.cache[3])
        except:
            pass

    
    def berechnen(self, alleszeigen=False, aktuellezahl=1, zeile=0, obergrenze=100):
        """In der Methode befindet sich der Algorithmus von Befreundet und Vollkommen.
        Alleszeigen entscheidet ob alle Werte angezeit werden sollen oder nicht.
        Aktuellezahl ist die Zahl, die gerade berechnet wird. Die Variable Zeile sagt
        aus in welcher Zeile geschrieben wird. Obergrenze ist das Limit der Berechnung."""
        worker = befr_alg.Befreundet()
        
        if not self.fort:
            self.list.DeleteAllItems()
        
        for aktuellezahl in range(1, obergrenze + 1):
            # Der momentane Durchlauf wird angezeigt
            self.SetStatusText('Aktueller Durchlauf: ' + str(aktuellezahl), 0)
            aktuellezahl, summe1, summe2, kommentar = worker.berechneZahlen(aktuellezahl)
            
            if not alleszeigen:
                if kommentar == 'befreundet und vollkommen':
                    self.list.InsertStringItem(zeile, str(aktuellezahl))
                    self.list.SetStringItem(zeile, 1, str(summe1))
                    self.list.SetStringItem(zeile, 2, str(summe2))
                    self.list.SetStringItem(zeile, 3, kommentar)
            else:
                self.list.InsertStringItem(zeile, str(aktuellezahl))
                self.list.SetStringItem(zeile, 1, str(summe1))
                self.list.SetStringItem(zeile, 2, str(summe2))
                self.list.SetStringItem(zeile, 3, kommentar)

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame()
        frame.Show(True)
        return True

if __name__ == '__main__':
    app = MyApp(False)
    app.MainLoop()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
beuvo

danke. aber jetzt kann ich im gui keine zahlen mehr prüfen.
das gui lässt sich zwar öffnen, doch sobald ich sage er solle mit der berechnung beginnen, gibt er mir fehlermeldungen und arbeitet nicht weiter.
beuvo

sry stimmt so garnicht. ich kann keine andere obergrenze mehr eingeben. ich kann nur noch bis 100 prüfen.
was muss ich ändern?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

beuvo hat geschrieben:was muss ich ändern?
Deine Einstellung. Ich kann ja schon Programmieren, du kannst selber gucken, wo eine Exception geworfen wird.

Warum ist es für dich denn so schwer in der def berechne() noch ein

Code: Alles auswählen

obergrenze = int(obergrenze)
hinzuzufügen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten