2016-11-09 2 views
0

私は、カスタムウィジェットを使ってQListView内のpostgresql dbから取得したレコードを追加してリストする単純なQtアプリケーションを持っています。ので、私は現在、それが失敗しています カスタムQListViewウィジェットへのメソッドの接続 - PyQt5&postgreSQL

from PyQt5 import QtCore, QtWidgets 
import psycopg2 
import sys 
import dbAPP_GUI 
import listItem_GUI 


class dbAPP(QtWidgets.QMainWindow, dbAPP_GUI.Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(dbAPP, self).__init__(parent) 
     self.setupUi(self) 

     self.conn = psycopg2.connect(database="Name", user="[email protected]" 
            , password="14581458", host="127.0.0.1") 

     self.ListItemLine = listItem() 

     # ============== 
     # CONNECTIONS 
     # ============== 
     self.btn_save.clicked.connect(self.writeData) 
     self.tabWidget.currentChanged.connect(self.fetchData) 
     self.btn_go.clicked.connect(self.searchData) 


    # ============= 
    # METHODS 
    # ============= 
    def writeData(self): 
     name = self.name_lineEdit.text() 
     surn = self.surname_lineEdit.text() 
     age = self.age_lineEdit.text() 
     address = self.address_lineEdit.text() 

     if len(name) > 0: 
      c = self.conn.cursor() 
      c.execute(" INSERT INTO info (name, surname, age, address)" 
         "VALUES (%s, %s, %s, %s)", (name, surn, age, address)) 
      self.conn.commit() 

      QtWidgets.QMessageBox.information(self, "Notice", "Information was successfully written to database") 

      self.name_lineEdit.clear() 
      self.surname_lineEdit.clear() 
      self.age_lineEdit.clear() 
      self.address_lineEdit.clear() 
     else: 
      QtWidgets.QMessageBox.warning(self, "Warning", "The name field is empty, please enter a value") 


    def fetchData(self): 
     self.listWidget.clear() 
     lineNo = 0 
     c = self.conn.cursor() 
     c.execute("SELECT * FROM info;") 
     listing = c.fetchall() 

     for i in listing: 

      name = (str(i[:1]).replace("(", "").replace(")", "").replace("'", "").replace(",", "")) 
      surn = (str(i[1:2]).replace("(", "").replace(")", "").replace("'", "").replace(",", "")) 
      age = (str(i[2:3]).replace("(", "").replace(")", "").replace("'", "").replace(",", "")) 
      address = (str(i[3:4]).replace("(", "").replace(")", "").replace("'", "").replace(",", "")) 
      ID = (str(i[4:5]).replace("(", "").replace(")", "").replace("'", "").replace(",", "")) 
      nameSurn = name + " " + surn 

      lineNo += 1 

      label = listItem() 
      label.num_label.setText(str(lineNo)) 
      label.nameSurn_label.setText(nameSurn) 
      label.age_label.setText(age) 
      label.address_label.setText(address) 
      label.id_label.setText(ID) 

      x = QtWidgets.QListWidgetItem() 
      x.setSizeHint(QtCore.QSize(280, 60)) 

      self.listWidget.addItem(x) 
      self.listWidget.setItemWidget(x, label) 

      label.show() 


    def searchData(self): 
     self.listWidget_2.clear() 
     lineNo = 0 
     c = self.conn.cursor() 
     c.execute("SELECT * FROM info;") 
     results = c.fetchall() 

     for i in results: 
      name = (str(i[:1]).replace("(", "").replace(")", "").replace("'", "").replace(",", "")) 
      surn = (str(i[1:2]).replace("(", "").replace(")", "").replace("'", "").replace(",", "")) 
      age = (str(i[2:3]).replace("(", "").replace(")", "").replace("'", "").replace(",", "")) 
      address = (str(i[3:4]).replace("(", "").replace(")", "").replace("'", "").replace(",", "")) 
      nameSurn = name + " " + surn 

      if str(self.search_lineEdit.text()).lower() == name.lower()\ 
        or str(self.search_lineEdit.text()).lower() == surn.lower()\ 
        or str(self.search_lineEdit.text()).lower() == address.lower(): 

       lineNo += 1 

       label = listItem() 
       label.num_label.setText(str(lineNo)) 
       label.nameSurn_label.setText(nameSurn) 
       label.age_label.setText(age) 
       label.address_label.setText(address) 

       x = QtWidgets.QListWidgetItem() 
       x.setSizeHint(QtCore.QSize(280, 60)) 

       self.listWidget_2.addItem(x) 
       self.listWidget_2.setItemWidget(x, label) 

       label.show() 

# ====================================================================================================================== 

class listItem(QtWidgets.QWidget, listItem_GUI.Ui_lineItem): 
    def __init__(self, parent=None): 
     super(listItem, self).__init__(parent) 
     self.setWindowFlags(QtCore.Qt.FramelessWindowHint) 
     self.setupUi(self) 

     self.btn_del.clicked.connect(self.delData) 


    def delData(self): 
     ID = self.id_label.text() 
     print(ID) 

     c = psycopg2._ext.connection.cursor() 
     c.execute("DELETE FROM info WHERE id=(%s)", (ID)) 

# ====================================================================================================================== 
app = QtWidgets.QApplication(sys.argv) 
app.setStyle("fusion") 
main = dbAPP() 
main.show() 
List = listItem() 
List.hide() 
sys.exit(app.exec_()) 
に効果的にDBからレコードを削除する(インスタンスの)レコードの主キーを使用するいくつかの困難プッシュボタンを設定する(各リスト項目のインスタンスの左下隅)を抱えていますメソッド "DelData"のカーソルオブジェクトには引数が必要です。しかしこれが正しい方法であれば、私は正直言って言えません。だから誰かがより良い提案をしている場合、それも動作する可能性があります。私はPyQt、postgreSQL、Pythonで足を見つけようとしています:)

答えて

0

executeの2番目の引数は、シーケンスまたはマッピングです。しかし、タプルは主にカンマで区切られているので、実際には文字列を渡しています。

だから、あなたがこれを行う必要があり、次のいずれか

c.execute("DELETE FROM info WHERE id=%s", (ID,)) # tuple 

またはこの:

c.execute("DELETE FROM info WHERE id=%s", [ID]) # list 

またはこの:OK

c.execute("DELETE FROM info WHERE id=%(ID)s", {'ID': ID}) # dict 
+0

を....私はあなたに感謝し、その軽微な変更を行いました入力のため: しかし、私はまだ引数を探してカーソルオブジェクトに関してはエラーが発生しています – Ants

+0

@Ants 。何のエラー?あなたの質問を編集し、完全なトレースバックを追加してください。 – ekhumoro

関連する問題