【问题标题】:Python crashing when trying to view data in PyQT5 [duplicate]尝试在 PyQT5 中查看数据时 Python 崩溃 [重复]
【发布时间】:2019-04-25 11:32:52
【问题描述】:

抱歉,如果我的标题不清楚;我正在尝试从 SQLLite 数据库(正在工作)中检索一些数据,并将其显示给 PyQt5 中的窗口上的用户。到目前为止,我已经设法在 Python 中检索结果并打印,但是当尝试在窗口中添加/查看结果时,Python 只会崩溃。 我在下面插入了不起作用的代码。 (复制时缩进有点奇怪,但在我的文件中完全没问题)。

class Profile(QWidget):
def __init__(self, Type):
    super().__init__()
    self.window = QWidget()
    self.window.setGeometry(100,100, 350, 400)
    self.window.setWindowTitle("Welcome")
    self.window.show()
    self.Choices()

def Choices(self):
    self.layout = QGridLayout()
    c.execute('''SELECT username, teamname FROM Users WHERE username = ?''',
    (user,))
    result = c.fetchone()
    print(result)
    print(user)

    self.TeamInfo = QLabel(result)
    self.layout.addWidget(self.TeamInfo)
    self.window.setLayout(self.layout)
    self.window.show()

user 是前一个窗口(登录页面)中的全局变量,以避免用户必须重新输入他们的用户名。本节不包括在内,因为这不是问题。课堂上的所有其他按钮都在工作 - 它只是这个特定的部分。非常感谢有关如何解决此问题的任何帮助,我认为问题出在 self.TeamInfo = QLabel(result) 行,但我不知道如何解决此问题的 PyQT5 知识。

编辑:我已经包含了我收到的错误消息的屏幕截图。

【问题讨论】:

  • print(result, type(result)) 的输出是什么?并显示完整的错误消息。
  • @eyllanesc 输出为:('john1', 'johns team') ,错误消息是另一个窗口,显示 Python 已停止工作
  • 使用self.TeamInfo = QLabel(" ".join(results))

标签: python python-3.x pyqt pyqt5


【解决方案1】:

如果我理解正确,您正在尝试向 QLabel 添加文本,对吗? 根据文档,向其中添加文本是由:QLabel().setText(result).

编辑:你能试试这个并告诉我编译器在抱怨什么吗?

label = QLabel()
label.setText(result)
self.layout.addWidget(label)

【讨论】:

  • 能否粘贴一下编译器在运行代码时所说的内容?
  • 编译器弹出一个窗口,抱怨 Python 已停止工作,尝试修复它,然后弹出 Python 已完全停止工作的窗口,它正在打印 user,所以它能够通过那个点.
  • 我试过你的代码,它似乎被 eyllanesc 的回复解决了。问题是您试图在标签内放置一个元组,这似乎只接受字符串。当我尝试将元组放入标签时,我的 IDE 中出现此错误:QLabel(parent: QWidget = None, flags: Union[Qt.WindowFlags, Qt.WindowType] = Qt.WindowFlags()): argument 1 has unexpected type 'tuple'
【解决方案2】:

试试看:

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

import sqlite3

class Profile(QWidget):
    def __init__(self, Type=None):
        super().__init__()
        self.window = QWidget()
        self.window.setGeometry(100,100, 350, 400)
        self.window.setWindowTitle("Welcome")
        self.Choices()

    def Choices(self):
        self.layout = QGridLayout()

#        c.execute('''SELECT username, teamname FROM Users WHERE username = ?''',
#                  (user,))
#        result = c.fetchone()
#

        user = "Nick" 
        try:
            self.conn = sqlite3.connect("database.db")
            self.c = self.conn.cursor()
#            result = self.c.execute("SELECT * from students WHERE name='{}'".format(user) )   
            result = self.c.execute("SELECT * from students WHERE name=?", (user, ))

            row = result.fetchone()                                               # <---
            print("\nrow->", type(row), row)
            serachresult = "Rollno : "+str(row[0])+'\n'+"Name : "+str(row[1])+'\n'+"Branch : "+str(row[2])+'\n'+"Sem : "+str(row[3])+'\n'+"Address : "+str(row[4])
            QMessageBox.information(QMessageBox(), 'Successful', serachresult)
            self.conn.commit()
            self.c.close()
            self.conn.close()
        except Exception:
            QMessageBox.warning(QMessageBox(), 'Error', 'Could not Find student from the database.')

        print(result)
        print(user)

        self.TeamInfo = QLabel(", ".join([ str(i) for i in row ]))                # <---
        self.layout.addWidget(self.TeamInfo)
        self.window.setLayout(self.layout)
        self.window.show()

if __name__ == '__main__':
     app = QApplication(sys.argv)
     main = Profile()
     main.show()
     sys.exit(app.exec_()) 

【讨论】:

  • self.c.execute("SELECT * from students WHERE name='{}'".format(user)) == SQL 注入 :-( .... 阅读 docs.python.org/3/library/sqlite3.html: # Never do this -- insecure! symbol = 'RHAT' c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)。最好使用占位符:self.c.execute("SELECT * from students WHERE name=?", (user, ))
  • @eyllanesc 谢谢
  • 不要提供代码只是为了响应OP,这里最重要的是问题是它的质量,以便它为整个社区服务,并且始终使用:尝试它没有帮助,你为什么不解释OP的代码失败和你的解决方案?
猜你喜欢
  • 2019-03-23
  • 2011-06-09
  • 2020-01-28
  • 2021-04-05
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
相关资源
最近更新 更多