Nordmoen Skrevet 31. august 2008 Del Skrevet 31. august 2008 Jeg holder på med et lite program som litt trening. Hele programmet skal lagre DVD-samling og kunne hente opp litt forskjellige ting. Problemet er at når jeg søker gjennom filen og finner linjen så tar den bare ut den siste linjen. F.eks Hvis jeg har lagret 5 James Bond filmer så henter den bare den siste hvis jeg søker etter James eller Bond. Her er selve søke funksjonen: def find_dvd(self, event): # wxGlade: MyFrame.<event_handler> try: search = open('dvd_123.txt', 'r') for lines in search: name = self.search_text.GetValue() if name in lines: self.search_list.SetValue(lines + '\n') search.close except(IOError): self.search_list.SetValue("You havn't added any files") Hele GUI'en er laget med wx.Glade(som jeg synes fungerer kjempe bra) noe som betyr at det kanskje er mye søppelkode, men det fungerer sånn som det skal. Her er hele programmet: #!/usr/bin/env python # -*- coding: utf-8 -*- # generated by wxGlade 0.6.3 on Tue Aug 26 20:29:58 2008 import wx, sys, fileinput # begin wxGlade: extracode # end wxGlade ID_ABOUT = 101 ID_QUIT = 102 class MyFrame(wx.Frame): def __init__(self, *args, **kwds): # begin wxGlade: MyFrame.__init__ kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) self.notebook_1 = wx.Notebook(self, -1, style=0) self.notebook_1_pane_3 = wx.Panel(self.notebook_1, -1) self.notebook_1_pane_2 = wx.Panel(self.notebook_1, -1) self.window_1 = wx.SplitterWindow(self.notebook_1_pane_2, -1, style=wx.SP_3D|wx.SP_BORDER) self.window_1_pane_2 = wx.Panel(self.window_1, -1) self.window_1_pane_1 = wx.Panel(self.window_1, -1) self.notebook_1_pane_1 = wx.Panel(self.notebook_1, -1) self.label_1 = wx.StaticText(self.notebook_1_pane_1, -1, "Name:") self.name_text = wx.TextCtrl(self.notebook_1_pane_1, -1, "", style=wx.TE_MULTILINE) self.label_2 = wx.StaticText(self.notebook_1_pane_1, -1, "Filepath/Folder") self.file_name = wx.TextCtrl(self.notebook_1_pane_1, -1, "", style=wx.TE_MULTILINE) self.label_3 = wx.StaticText(self.notebook_1_pane_1, -1, "Type:") self.type_combo = wx.ComboBox(self.notebook_1_pane_1, -1, choices=["Action", "Comedy", "Horror", "Drama", "Sci-Fi", "Series"], style=wx.CB_DROPDOWN) self.panel_1 = wx.Panel(self.notebook_1_pane_1, -1) self.add_dvd_button = wx.Button(self.notebook_1_pane_1, -1, "Add DVD") self.dvd_list = wx.TextCtrl(self.notebook_1_pane_2, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER|wx.TE_READONLY|wx.HSCROLL) self.load_gague = wx.Gauge(self.window_1_pane_1, -1, 1000, style=wx.GA_HORIZONTAL|wx.GA_SMOOTH) self.load_button = wx.Button(self.window_1_pane_2, -1, "Get Collection") self.label_4 = wx.StaticText(self.notebook_1_pane_3, -1, "Name to Search for:") self.search_text = wx.TextCtrl(self.notebook_1_pane_3, -1, "", style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER) self.find_button = wx.Button(self.notebook_1_pane_3, -1, "Find DVD") self.search_list = wx.TextCtrl(self.notebook_1_pane_3, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER|wx.TE_READONLY|wx.HSCROLL) # Menu Bar self.frame_1_menubar = wx.MenuBar() wxglade_tmp_menu = wx.Menu() self.ID_ABOUT = wx.MenuItem(wxglade_tmp_menu, ID_ABOUT, "&About", "About this program", wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.ID_ABOUT) wxglade_tmp_menu.AppendSeparator() self.ID_QUIT = wx.MenuItem(wxglade_tmp_menu, ID_QUIT, "Q&uit", "Terminates the program", wx.ITEM_NORMAL) wxglade_tmp_menu.AppendItem(self.ID_QUIT) self.frame_1_menubar.Append(wxglade_tmp_menu, "&File") self.SetMenuBar(self.frame_1_menubar) # Menu Bar end self.frame_1_statusbar = self.CreateStatusBar(1, 0) self.__set_properties() self.__do_layout() self.Bind(wx.EVT_BUTTON, self.ADD_DVD, self.add_dvd_button) self.Bind(wx.EVT_BUTTON, self.get_collection, self.load_button) self.Bind(wx.EVT_BUTTON, self.find_dvd, self.find_button) self.Bind(wx.EVT_MENU, self.EVT_ABOUT, self.ID_ABOUT) self.Bind(wx.EVT_MENU, self.EVT_QUIT, self.ID_QUIT) # end wxGlade def __set_properties(self): # begin wxGlade: MyFrame.__set_properties self.SetTitle("DVD-Collection V0.04") _icon = wx.EmptyIcon() _icon.CopyFromBitmap(wx.Bitmap("/home/nordmoen/Bilder/cd_dvd_players.jpg", wx.BITMAP_TYPE_ANY)) self.SetIcon(_icon) self.SetSize((545, 424)) self.label_1.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, "")) self.name_text.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "")) self.name_text.SetMinSize((200, 35)) self.label_2.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, "")) self.file_name.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, "")) self.file_name.SetMinSize((200, 35)) self.label_3.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, "")) self.type_combo.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, "")) self.type_combo.SetSelection(-1) self.add_dvd_button.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, "")) self.load_gague.SetMinSize((250, 40)) self.load_button.SetMinSize((200, 35)) self.add_dvd_button.SetMinSize((200, 35)) self.search_text.SetMinSize((200, 35)) self.load_button.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, "")) self.label_4.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, "")) self.find_button.SetMinSize((100, 35)) self.frame_1_statusbar.SetStatusWidths([-1]) # statusbar fields frame_1_statusbar_fields = ["Normal Mode", "DVD Added"] for i in range(len(frame_1_statusbar_fields)): self.frame_1_statusbar.SetStatusText(frame_1_statusbar_fields[i], i) # end wxGlade def __do_layout(self): # begin wxGlade: MyFrame.__do_layout sizer_1 = wx.BoxSizer(wx.VERTICAL) sizer_5 = wx.BoxSizer(wx.VERTICAL) sizer_2 = wx.BoxSizer(wx.VERTICAL) sizer_4 = wx.BoxSizer(wx.HORIZONTAL) sizer_3 = wx.BoxSizer(wx.HORIZONTAL) grid_sizer_1 = wx.GridSizer(5, 2, 5, 5) grid_sizer_1.Add(self.label_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.name_text, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.label_2, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.file_name, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.label_3, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.type_combo, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0) grid_sizer_1.Add(self.add_dvd_button, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) self.notebook_1_pane_1.SetSizer(grid_sizer_1) sizer_2.Add(self.dvd_list, 1, wx.EXPAND, 0) sizer_3.Add(self.load_gague, 0, wx.ALIGN_CENTER_VERTICAL, 0) self.window_1_pane_1.SetSizer(sizer_3) sizer_4.Add(self.load_button, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) self.window_1_pane_2.SetSizer(sizer_4) self.window_1.SplitVertically(self.window_1_pane_1, self.window_1_pane_2) sizer_2.Add(self.window_1, 1, wx.EXPAND, 0) self.notebook_1_pane_2.SetSizer(sizer_2) sizer_5.Add(self.label_4, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) sizer_5.Add(self.search_text, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) sizer_5.Add(self.find_button, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.SHAPED, 0) sizer_5.Add(self.search_list, 1, wx.EXPAND, 0) self.notebook_1_pane_3.SetSizer(sizer_5) self.notebook_1.AddPage(self.notebook_1_pane_1, "Add DVD") self.notebook_1.AddPage(self.notebook_1_pane_2, "Collection") self.notebook_1.AddPage(self.notebook_1_pane_3, "Find DVD") sizer_1.Add(self.notebook_1, 1, wx.EXPAND, 0) self.SetSizer(sizer_1) self.Layout() # end wxGlade def ADD_DVD(self, event): # wxGlade: MyFrame.<event_handler> try: add = open('dvd_123.txt', 'a') add.write("%s | Filepath/Folder: %s | Type: %s \n" %(self.name_text.GetValue(), self.file_name.GetValue(), self.type_combo.GetValue())) add.close finally: self.frame_1_statusbar.SetStatusText('DVD added') self.name_text.Clear() self.file_name.Clear() def get_collection(self, event): # wxGlade: MyFrame.<event_handler> self.load_gague.SetValue(0) try: ff = open('dvd_123.txt', 'r') self.dvd_list.SetValue(ff.read()) ff.close self.load_gague.SetValue(1000) except (IOError): self.dvd_list.SetValue("You havn't added any DVD's") event.Skip() def find_dvd(self, event): # wxGlade: MyFrame.<event_handler> try: search = open('dvd_123.txt', 'r') for lines in search: name = self.search_text.GetValue() if name in lines: self.search_list.SetValue(lines + '\n') search.close except(IOError): self.search_list.SetValue("You havn't added any files") def EVT_ABOUT(self, event, caption = 'DVD-Collection'): # wxGlade: MyFrame.<event_handler> message = 'This is a program to collect your whole DVD-collection.\n \n If you find any bugs please report them to nordmoen at getmail.no' dlg = wx.MessageDialog(self, message, caption, wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() def EVT_QUIT(self, event,caption = 'Quit Yes/No'): # wxGlade: MyFrame.<event_handler> question = ' Do you really want to quit?' dlg_quit = wx.MessageDialog(self, question, caption, wx.YES_NO | wx.ICON_QUESTION) result = dlg_quit.ShowModal() == wx.ID_YES dlg_quit.Destroy() if result == True: self.Close(True) # end of class MyFrame if __name__ == "__main__": app = wx.PySimpleApp(0) wx.InitAllImageHandlers() frame_1 = MyFrame(None, -1, "") app.SetTopWindow(frame_1) frame_1.Show() app.MainLoop() Engelsken min er sikkert ikke helt på top så hvis det er noen skrivefeil så bare overse dem(og si ifra) Lenke til kommentar
terjeelde Skrevet 31. august 2008 Del Skrevet 31. august 2008 For meg virker det som at funksjonen finner alle linjene, men siden den setter resultatet for hver gang den finner en linje, så blir det krull. Funksjonen finner først en match, og setter den. Så finner den en ny match, og setter den. I stedet for å legge den til. Da står du til slutt igjen med bare siste match. Grei løsning kan kanskje være å bytte om, slik at du har en array av match-objekter? Alternativt bytte: self.search_list.SetValue(lines + '\n') med: self.search_list.SetValue(self.search_list.getValue() + lines + '\n') I alle tilfelle vil jeg egentlig anbefale deg å se på f.eks PostgreSQL for oppbevaring av data istedet for en tekstfil. Lenke til kommentar
Nordmoen Skrevet 31. august 2008 Forfatter Del Skrevet 31. august 2008 (endret) Takk, det fungerte selvsagt kjempe bra Skal se på PostgreSQL, bare å google? eller har du en link til en grei start? Dette er mitt første program så det blir ikke spesielt avansert på første forsøk Foresten: Hvordan er PostgreSQL mot den som er "innebygget" i python? Endret 31. august 2008 av Spec-ops-j Lenke til kommentar
terjeelde Skrevet 31. august 2008 Del Skrevet 31. august 2008 Skal se på PostgreSQL, bare å google? eller har du en link til en grei start? Bare å google i vei. PostgreSQL-siden har veldig bra manual online, så lett å komme igang. Foresten:Hvordan er PostgreSQL mot den som er "innebygget" i python? Ikke helt sikker på hva du mener her, men du tenker kanskje på sqlite? Da blir forskjellene: PostgreSQL er en client-server løsning. Du har en sentral PostgreSQL database, som flere programmer, utviklet i flere språk, alle kan jobbe mot. Sqlite blir nesten som en del av programmet. Du bruker den vanligvis bare fra ett program, og har databasen lagret som en programfil for programmet. PostgreSQL er en veldig rask og komplett database, med mulighet for å vokse i forskjellige retninger. Stored procedures, raske komplekse spørringer, gode sjekker av input-data osv. Sqlite er mer egnet for å ha ett greit sted å dumpe ting. Den er mindre avansert, støtter færre ting, og er slappere på data-håndtering. Derimot er den gjerne raskere til en del type oppgavet. Alt i alt vil jeg anbefale at om du skal velge en å se på, så ville jeg gått for PostgreSQL hvis du er villig til å bruke litt tid til å bli kjent med den. Vil du bare ha ett raskt sted å dumpe ting, uten at databaser og SQL er interessant, så er kanskje sqlite enklere å komme i gang med. Terje Lenke til kommentar
Nordmoen Skrevet 31. august 2008 Forfatter Del Skrevet 31. august 2008 Takk for at du tar deg tiden til å svare Tror egentlig at jeg skal gå for sqlite til dette programmet, siden jeg ikke trenger(eller har) en server å hoste på. Lenke til kommentar
steingrim Skrevet 31. august 2008 Del Skrevet 31. august 2008 Tror egentlig at jeg skal gå for sqlite til dette programmet, siden jeg ikke trenger(eller har) en server å hoste på. Jeg ville uansett gått for sqlite til noe sånt som dette, det fungerer raskt nok og greit nok til slike programmer. Du kan forøvrig kjøre Postgresql på din vanlige pc, klient/server betyr ikke at det må kjøre på forskjellige maskiner. Lenke til kommentar
Nordmoen Skrevet 1. september 2008 Forfatter Del Skrevet 1. september 2008 Tror egentlig at jeg skal gå for sqlite til dette programmet, siden jeg ikke trenger(eller har) en server å hoste på. Jeg ville uansett gått for sqlite til noe sånt som dette, det fungerer raskt nok og greit nok til slike programmer. Du kan forøvrig kjøre Postgresql på din vanlige pc, klient/server betyr ikke at det må kjøre på forskjellige maskiner. Var det jeg tenkte også. Lenke til kommentar
siDDis Skrevet 2. september 2008 Del Skrevet 2. september 2008 Det er 3 grunner til å velge PostgreSQL framfor SQLite Den eine er: PostgreSQL tilbyr ein 'sær' funksjonalitet som du trenger(tablespaces, git osv) Den andre er: Du bruker mange komplekse spørringer Den tredje er: Fleire samtidige brukere (som hender ofte). Om det er bare eit program/bruker som skal aksessere databasen så er SQLite eit lynkjapt, enkelt alternativ. Sjølv om databasen er to Terrabytes stort og ikkje involverer komplekse spørringer så vil SQLite være raskaste og mest effektive alternativet. Ikkje undervurder SQLite Lenke til kommentar
Nordmoen Skrevet 2. september 2008 Forfatter Del Skrevet 2. september 2008 Ok Men har nå et lite problem, får enkelt lagt til ting i databasen, men når jeg skal hente det ut igjen får jeg det ikke til. hvorfor fungerer ikke dette: con = sqlite.connect("dvd_database") cur = con.cursor() cur.execute('SELECT * FROM dvd') for row in cur: name_1 = 'Name:', row[0],'|', 'Where?:', row[1],'|','Type:', row[2] self.dvd_list.SetValue(name_1) Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå