class Personenfenster(QWidget): def __init__(self): super().__init__() self.init() self.suche=False def string2list(self,tupel): retlist=[] for index in range(len(tupel)): string = tupel[index][0] retlist.append(string) return retlist def init(self): #Daten aus der Datenbank c.execute("SELECT nachname FROM personen") nachnamenlistealsstring=c.fetchall() c.execute("SELECT vorname FROM personen") vornamenlistealsstring=c.fetchall() c.execute("SELECT geburtsdatum FROM personen") geburtsdatenlistealsstring=c.fetchall() c.execute("SELECT person_id FROM personen") idlistealsstring=c.fetchall() nachnamenliste = self.string2list(nachnamenlistealsstring) vornamenliste = self.string2list(vornamenlistealsstring) geburtsdatenliste = self.string2list(geburtsdatenlistealsstring) idliste = self.string2list(idlistealsstring) self.scrollmatrix = [] for index,item in enumerate(vornamenliste): self.scrollmatrix.append([nachnamenliste[index],item, geburtsdatenliste[index],idliste[index]]) #Suchenfeld self.Input = QLineEdit(self) self.Input.setPlaceholderText("Suchen...") self.Input.returnPressed.connect(self.Inputtext) #+-Button self.AddButton = QPushButton("+") self.AddButton.clicked.connect(self.addPerson) self.clearButton = QPushButton("reset") self.clearButton.clicked.connect(self.clear) #HBox mit dem Suchen Feld ganz links und dem +-Button ganz rechts self.suchen = QHBoxLayout() self.suchen.addWidget(self.Input) self.suchen.addStretch(1) #self.suchen.addWidget(self.clearButton) self.suchen.addWidget(self.AddButton) #HBox mit den Überschriften für die einzelnen Zeilen: self.row0 = QGridLayout() self.row0.addWidget(QLabel("Nachname"),0,0,1,2) self.row0.addWidget(QLabel("Vorname"),0,2,1,2) self.row0.addWidget(QLabel("Geburtsdatum"),0,4,1,2) self.row0.addWidget(QLabel("Beten/Bearbeiten"),0,6,1,2) #Hier kommt die Personenanzeige self.scroll = QScrollArea() self.personenanzeige = QWidget() self.scroll.setWidgetResizable(True) #Hier kommen die Personen self.personenanzeigenLayout = QVBoxLayout(self.personenanzeige) for person in self.scrollmatrix: self.personenanzeigenLayout.addLayout(Row(person)) self.personenanzeigenLayout.addStretch(1) self.personenanzeige.setLayout(self.personenanzeigenLayout) self.scroll.setWidget(self.personenanzeige) #setzt alles in eine große VBox self.vbox = QVBoxLayout() self.vbox.addLayout(self.suchen) self.vbox.addLayout(self.row0) self.vbox.addWidget(self.scroll) self.setLayout(self.vbox) def Inputtext(self): text1 = self.Input.text() if text1!=None and text1!="": text1=str(text1) c.execute("SELECT nachname FROM personen") nachnamenlistealsstring=c.fetchall() c.execute("SELECT vorname FROM personen") vornamenlistealsstring=c.fetchall() c.execute("SELECT geburtsdatum FROM personen") geburtsdatenlistealsstring=c.fetchall() c.execute("SELECT person_id FROM personen") idlistealsstring=c.fetchall() nachnamenliste = self.string2list(nachnamenlistealsstring) vornamenliste = self.string2list(vornamenlistealsstring) geburtsdatenliste = self.string2list(geburtsdatenlistealsstring) idliste = self.string2list(idlistealsstring) searchednachname=[] for nachname in nachnamenliste: if nachname: if text1 in nachname: searchednachname.append(nachname) searchedvorname=[] for vorname in vornamenliste: if vorname: if text1 in vorname: searchedvorname.append(vorname) idliste=[] searchednachname=list(set(searchednachname)) searchedvorname=list(set(searchedvorname)) for i in searchednachname: c.execute("""SELECT person_id FROM personen WHERE nachname="{}" """.format(i)) a=c.fetchall() for j in a: idliste.append(j[0]) for i in searchedvorname: c.execute("""SELECT person_id FROM personen WHERE vorname="{}" """.format(i)) a=c.fetchall() for j in a: idliste.append(j[0]) idliste=list(set(idliste)) if len(idliste)>0: nachnamenliste=[] vornamenliste=[] geburtsdatenliste=[] for i in idliste: c.execute("""SELECT nachname FROM personen WHERE person_id={}""".format(i)) nachnamenliste.append(c.fetchall()[0][0]) c.execute("""SELECT vorname FROM personen WHERE person_id={}""".format(i)) vornamenliste.append(c.fetchall()[0][0]) c.execute("""SELECT geburtsdatum FROM personen WHERE person_id={}""".format(i)) geburtsdatenliste.append(c.fetchall()[0][0]) #Neugestaltung mit gesuchten Werten self.scrollmatrix = [] for index,item in enumerate(vornamenliste): self.scrollmatrix.append([nachnamenliste[index],item, geburtsdatenliste[index],idliste[index]]) self.vbox.removeWidget(self.scroll) self.scroll.close() #Hier kommt die Personenanzeige self.scroll = QScrollArea() self.personenanzeige = QWidget() self.scroll.setWidgetResizable(True) #Hier kommen die Personen self.personenanzeigenLayout = QVBoxLayout(self.personenanzeige) for person in self.scrollmatrix: self.personenanzeigenLayout.addLayout(Row(person)) self.personenanzeigenLayout.addStretch(1) self.personenanzeige.setLayout(self.personenanzeigenLayout) self.scroll.setWidget(self.personenanzeige) self.vbox.addWidget(self.scroll) self.vbox.update() else: self.vbox.removeWidget(self.scroll) self.scroll.close() noresults = QWidget() noresultslayout=QVBoxLayout() noresultslabel=QLabel("""Zu diesem Suchbegriff wurden leider keine Ergebnisse gefunden\n Versuchen Sie es mit einem anderen Suchbegriff oder fügen Sie die gesuchte Person hinzu""") noresultslabel.setAlignment(Qt.AlignCenter) noresultslayout.addWidget(noresultslabel) noresults.setLayout(noresultslayout) self.scroll = QScrollArea() self.scroll.setWidget(noresults) self.vbox.addWidget(self.scroll) self.vbox.update() self.suchen.removeWidget(self.AddButton) #self.suchen.removeWidget(self.clearButton) if not self.suche: self.breaksearchButton=QPushButton("Suche abbrechen") self.breaksearchButton.clicked.connect(self.breaksearch) self.suchen.addWidget(self.breaksearchButton) self.suche=True #self.suchen.addWidget(self.clearButton) self.suchen.addWidget(self.AddButton) self.suchen.update() def breaksearch(self): self.suchen.removeWidget(self.breaksearchButton) self.suche=False self.breaksearchButton.close() self.Input.setText("") self.suchen.update() self.updatedata() def clear(self): c.execute("DROP TABLE IF EXISTS personen") c.execute("""CREATE TABLE IF NOT EXISTS personen ( person_id INT(10) NOT NULL AUTO_INCREMENT, nachname VARCHAR(50) default null, vorname VARCHAR(50) not null, geburtsdatum date default null, primary key (person_id))""") c.execute("DROP TABLE IF EXISTS gebete") c.execute("""CREATE TABLE IF NOT EXISTS gebete ( gebets_id INT(10) NOT NULL AUTO_INCREMENT, person_id INT(10) NOT NULL, gebetsart VARCHAR(5) NOT NULL, anliegen VARCHAR(1000) NOT NULL, PRIMARY KEY (gebets_id) )""") c.execute("DROP TABLE IF EXISTS oldidlist") c.execute("""CREATE TABLE IF NOT EXISTS oldidlist ( ID INTEGER NOT NULL )""") conn.commit() self.updatedata() def updatedata(self): c.execute("SELECT nachname FROM personen") nachnamenlistealsstring=c.fetchall() c.execute("SELECT vorname FROM personen") vornamenlistealsstring=c.fetchall() c.execute("SELECT geburtsdatum FROM personen") geburtsdatenlistealsstring=c.fetchall() c.execute("SELECT person_id FROM personen") idlistealsstring=c.fetchall() nachnamenliste = self.string2list(nachnamenlistealsstring) vornamenliste = self.string2list(vornamenlistealsstring) geburtsdatenliste = self.string2list(geburtsdatenlistealsstring) idliste = self.string2list(idlistealsstring) self.scrollmatrix = [] for index,item in enumerate(vornamenliste): self.scrollmatrix.append([nachnamenliste[index],item, geburtsdatenliste[index],idliste[index]]) self.vbox.removeWidget(self.scroll) self.scroll.close() #Hier kommt die Personenanzeige self.scroll = QScrollArea() self.personenanzeige = QWidget() self.scroll.setWidgetResizable(True) #Hier kommen die Personen self.personenanzeigenLayout = QVBoxLayout(self.personenanzeige) for person in self.scrollmatrix: self.personenanzeigenLayout.addLayout(Row(person)) self.personenanzeigenLayout.addStretch(1) self.personenanzeige.setLayout(self.personenanzeigenLayout) self.scroll.setWidget(self.personenanzeige) self.vbox.addWidget(self.scroll) self.vbox.update() def addPerson(self): self.f = addPersonDialog(self)
class SettingsUI: # create settings form window def __init__(self, conf, conffile, icn): self.conf = conf self.conffile = conffile self.icon = icn self.scroll = QScrollArea() self.window = QWidget() self.separator = QFrame() self.scroll.setWindowIcon(QIcon(icn)) self.layoutV = QVBoxLayout() self.layoutH0 = QHBoxLayout() self.layoutH0a = QHBoxLayout() self.layoutH1 = QHBoxLayout() self.layoutH2 = QHBoxLayout() self.layoutH3 = QHBoxLayout() self.layoutH4 = QHBoxLayout() self.layoutH5 = QHBoxLayout() self.layoutH6a = QHBoxLayout() self.layoutH6b = QHBoxLayout() self.layoutH6c = QHBoxLayout() self.layoutH6d = QHBoxLayout() self.fBold = QFont() self.fBold.setBold(True) self.scroll.setWindowTitle('Now Playing v1.4.0 - Settings') self.scroll.setWidgetResizable(True) self.scroll.setWindowFlag(Qt.CustomizeWindowHint, True) self.scroll.setWindowFlag(Qt.WindowCloseButtonHint, False) # self.scroll.setWindowFlag(Qt.WindowMinMaxButtonsHint, False) self.scroll.setWindowFlag(Qt.WindowMinimizeButtonHint, False) self.scroll.setWidget(self.window) self.scroll.setMinimumWidth(625) self.scroll.resize(625, 825) # error section self.errLabel = QLabel() self.errLabel.setStyleSheet('color: red') # remote self.localLabel = QLabel('Track Retrieval Mode') self.localLabel.setFont(self.fBold) self.layoutV.addWidget(self.localLabel) self.remoteDesc = QLabel( 'Local mode (default) uses Serato\'s local history log for track data.\ \nRemote mode retrieves remote track data from Serato Live Playlists.') self.remoteDesc.setStyleSheet('color: grey') self.layoutV.addWidget(self.remoteDesc) # radios self.localRadio = QRadioButton('Local') self.localRadio.setChecked(True) self.localRadio.toggled.connect( lambda: self.on_radiobutton_select(self.localRadio)) self.localRadio.setMaximumWidth(60) self.remoteRadio = QRadioButton('Remote') self.remoteRadio.toggled.connect( lambda: self.on_radiobutton_select(self.remoteRadio)) self.layoutH0.addWidget(self.localRadio) self.layoutH0.addWidget(self.remoteRadio) self.layoutV.addLayout(self.layoutH0) # library path self.libLabel = QLabel('Serato Library Path') self.libLabel.setFont(self.fBold) self.libDesc = QLabel( 'Location of Serato library folder.\ni.e., \\THE_PATH_TO\\_Serato_' ) self.libDesc.setStyleSheet('color: grey') self.layoutV.addWidget(self.libLabel) self.layoutV.addWidget(self.libDesc) self.libButton = QPushButton('Browse for folder') self.layoutH0a.addWidget(self.libButton) self.libButton.clicked.connect(self.on_libbutton_clicked) self.libEdit = QLineEdit() self.layoutH0a.addWidget(self.libEdit) self.layoutV.addLayout(self.layoutH0a) # url self.urlLabel = QLabel('URL') self.urlLabel.setFont(self.fBold) self.urlDesc = QLabel( 'Web address of your Serato Playlist.\ne.g., https://serato.com/playlists/USERNAME/live' ) self.urlDesc.setStyleSheet('color: grey') self.layoutV.addWidget(self.urlLabel) self.urlEdit = QLineEdit() self.layoutV.addWidget(self.urlDesc) self.layoutV.addWidget(self.urlEdit) self.urlLabel.setHidden(True) self.urlEdit.setHidden(True) self.urlDesc.setHidden(True) # separator line self.separator.setFrameShape(QFrame.HLine) # self.separator.setFrameShadow(QFrame.Sunken) self.layoutV.addWidget(self.separator) # file self.fileLabel = QLabel('File') self.fileLabel.setFont(self.fBold) self.fileDesc = QLabel( 'The file to which current track info is written. (Must be plain text: .txt)' ) self.fileDesc.setStyleSheet('color: grey') self.layoutV.addWidget(self.fileLabel) self.layoutV.addWidget(self.fileDesc) self.fileButton = QPushButton('Browse for file') self.layoutH1.addWidget(self.fileButton) self.fileButton.clicked.connect(self.on_filebutton_clicked) self.fileEdit = QLineEdit() self.layoutH1.addWidget(self.fileEdit) self.layoutV.addLayout(self.layoutH1) # interval self.intervalLabel = QLabel('Polling Interval') self.intervalLabel.setFont(self.fBold) self.intervalDesc = QLabel('Amount of time, in seconds, \ that must elapse before checking for new track info. (Default = 10.0)') self.intervalDesc.setStyleSheet('color: grey') self.layoutV.addWidget(self.intervalLabel) self.layoutV.addWidget(self.intervalDesc) self.intervalEdit = QLineEdit() self.intervalEdit.setMaximumSize(40, 35) self.layoutV.addWidget(self.intervalEdit) self.intervalLabel.setHidden(True) self.intervalDesc.setHidden(True) self.intervalEdit.setHidden(True) # delay self.delayLabel = QLabel('Write Delay') self.delayLabel.setFont(self.fBold) self.delayDesc = QLabel('Amount of time, in seconds, \ to delay writing the new track info once it\'s retrieved. (Default = 0)') self.delayDesc.setStyleSheet('color: grey') self.layoutV.addWidget(self.delayLabel) self.layoutV.addWidget(self.delayDesc) self.delayEdit = QLineEdit() self.delayEdit.setMaximumWidth(40) self.layoutV.addWidget(self.delayEdit) # multi-line self.multiLabel = QLabel('Multiple Line Indicator') self.multiLabel.setFont(self.fBold) self.layoutV.addWidget(self.multiLabel) self.multiCbox = QCheckBox() self.multiCbox.setMaximumWidth(25) self.layoutH2.addWidget(self.multiCbox) self.multiDesc = QLabel('Write Artist and Song \ data on separate lines.') self.multiDesc.setStyleSheet('color: grey') self.layoutH2.addWidget(self.multiDesc) self.layoutV.addLayout(self.layoutH2) # quotes self.quoteLabel = QLabel('Song Quote Indicator') self.quoteLabel.setFont(self.fBold) self.layoutV.addWidget(self.quoteLabel) self.quoteCbox = QCheckBox() self.quoteCbox.setMaximumWidth(25) self.layoutH3.addWidget(self.quoteCbox) self.quoteDesc = QLabel('Surround the song title \ with quotes.') self.quoteDesc.setStyleSheet('color: grey') self.layoutH3.addWidget(self.quoteDesc) self.layoutV.addLayout(self.layoutH3) # prefixes self.prefixLabel = QLabel('Prefixes') self.prefixLabel.setFont(self.fBold) self.layoutV.addWidget(self.prefixLabel) self.a_prefixDesc = QLabel( 'Artist - String to be written before artist info.') self.a_prefixDesc.setStyleSheet('color: grey') self.s_prefixDesc = QLabel( 'Song - String to be written before song info.') self.s_prefixDesc.setStyleSheet('color: grey') self.layoutH6a.addWidget(self.a_prefixDesc) self.layoutH6a.addWidget(self.s_prefixDesc) self.a_prefixEdit = QLineEdit() self.s_prefixEdit = QLineEdit() self.layoutH6b.addWidget(self.a_prefixEdit) self.layoutH6b.addWidget(self.s_prefixEdit) self.layoutV.addLayout(self.layoutH6a) self.layoutV.addLayout(self.layoutH6b) # suffixes self.suffixLabel = QLabel('Suffixes') self.suffixLabel.setFont(self.fBold) self.layoutV.addWidget(self.suffixLabel) self.a_suffixDesc = QLabel( 'Artist - String to be written after artist info.') self.a_suffixDesc.setStyleSheet('color: grey') self.s_suffixDesc = QLabel( 'Song - String to be written after song info.') self.s_suffixDesc.setStyleSheet('color: grey') self.layoutH6c.addWidget(self.a_suffixDesc) self.layoutH6c.addWidget(self.s_suffixDesc) self.a_suffixEdit = QLineEdit() self.s_suffixEdit = QLineEdit() self.layoutH6d.addWidget(self.a_suffixEdit) self.layoutH6d.addWidget(self.s_suffixEdit) self.layoutV.addLayout(self.layoutH6c) self.layoutV.addLayout(self.layoutH6d) # notify self.notifLabel = QLabel('Notification Indicator') self.notifLabel.setFont(self.fBold) self.layoutV.addWidget(self.notifLabel) self.notifCbox = QCheckBox() self.notifCbox.setMaximumWidth(25) self.layoutH5.addWidget(self.notifCbox) self.notifDesc = QLabel('Show OS system notification \ when new song is retrieved.') self.notifDesc.setStyleSheet('color: grey') self.layoutH5.addWidget(self.notifDesc) self.layoutV.addLayout(self.layoutH5) # error area self.layoutV.addWidget(self.errLabel) # cancel btn self.cancelButton = QPushButton('Cancel') self.cancelButton.setMaximumSize(80, 35) self.layoutH4.addWidget(self.cancelButton) self.cancelButton.clicked.connect(self.on_cancelbutton_clicked) # save btn self.saveButton = QPushButton('Save') self.saveButton.setMaximumSize(80, 35) self.layoutH4.addWidget(self.saveButton) self.saveButton.clicked.connect(self.on_savebutton_clicked) self.layoutV.addLayout(self.layoutH4) self.window.setLayout(self.layoutV) def upd_win(self): c = ConfigFile(self.conf, self.conffile) if c.local: self.localRadio.setChecked(True) self.remoteRadio.setChecked(False) else: self.localRadio.setChecked(False) self.remoteRadio.setChecked(True) self.libEdit.setText(c.libpath) self.urlEdit.setText(c.url) self.fileEdit.setText(c.file) self.intervalEdit.setText(str(c.interval)) self.delayEdit.setText(str(c.delay)) self.multiCbox.setChecked(c.multi) self.quoteCbox.setChecked(c.quote) self.a_prefixEdit.setText(c.a_pref) self.a_suffixEdit.setText(c.a_suff) self.s_prefixEdit.setText(c.s_pref) self.s_suffixEdit.setText(c.s_suff) self.notifCbox.setChecked(c.notif) def upd_conf(self): local = str(self.localRadio.isChecked()) libpath = self.libEdit.text() url = self.urlEdit.text() file = self.fileEdit.text() interval = self.intervalEdit.text() delay = self.delayEdit.text() multi = str(self.multiCbox.isChecked()) quote = str(self.quoteCbox.isChecked()) a_pref = self.a_prefixEdit.text().replace(" ", "|_0") a_suff = self.a_suffixEdit.text().replace(" ", "|_0") s_pref = self.s_prefixEdit.text().replace(" ", "|_0") s_suff = self.s_suffixEdit.text().replace(" ", "|_0") notif = str(self.notifCbox.isChecked()) c = ConfigFile(self.conf, self.conffile) c.put(local, libpath, url, file, interval, delay, multi, quote, a_pref, a_suff, s_pref, s_suff, notif) # radio button action def on_radiobutton_select(self, b): if b.text() == 'Local': self.urlLabel.setHidden(True) self.urlEdit.setHidden(True) self.urlDesc.setHidden(True) self.intervalLabel.setHidden(True) self.intervalDesc.setHidden(True) self.intervalEdit.setHidden(True) self.libLabel.setHidden(False) self.libEdit.setHidden(False) self.libDesc.setHidden(False) self.libButton.setHidden(False) self.window.hide() self.errLabel.setText('') self.window.show() else: self.urlLabel.setHidden(False) self.urlEdit.setHidden(False) self.urlDesc.setHidden(False) self.intervalLabel.setHidden(False) self.intervalDesc.setHidden(False) self.intervalEdit.setHidden(False) self.libLabel.setHidden(True) self.libEdit.setHidden(True) self.libDesc.setHidden(True) self.libButton.setHidden(True) self.window.hide() self.errLabel.setText('') self.window.show() # file button action def on_filebutton_clicked(self): filename = QFileDialog.getOpenFileName(self.window, 'Open file', '.', '*.txt') if filename: self.fileEdit.setText(filename[0]) # file button action def on_libbutton_clicked(self): libdir = QFileDialog.getExistingDirectory(self.window, 'Select directory') if libdir: self.libEdit.setText(libdir) # cancel button action def on_cancelbutton_clicked(self): tray.actConfig.setEnabled(True) self.upd_win() self.close() self.errLabel.setText('') # save button action def on_savebutton_clicked(self): if self.remoteRadio.isChecked(): if 'https://serato.com/playlists' not in self.urlEdit.text() and \ 'https://www.serato.com/playlists' not in self.urlEdit.text() or \ len(self.urlEdit.text()) < 30: self.errLabel.setText('* URL is invalid') self.window.hide() self.window.show() return if self.localRadio.isChecked(): if '_Serato_' not in self.libEdit.text(): self.errLabel.setText( '* Serato Library Path is required. Should point to "_Serato_" folder' ) self.window.hide() self.window.show() return if self.fileEdit.text() == "": self.errLabel.setText('* File is required') self.window.hide() self.window.show() return self.upd_conf() self.close() self.errLabel.setText('') global ini if ini == 0: ini = 1 tray.actPause.setText('Pause') tray.actPause.setEnabled(True) main_thread.start() def show(self): tray.actConfig.setEnabled(False) self.upd_win() self.scroll.show() self.scroll.setFocus() def close(self): tray.actConfig.setEnabled(True) self.scroll.hide() def exit(self): self.scroll.close()