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()