Форум сайта python.su
Я понимаю что тема очень заезженная, НО если есть возможность помогите - не могу понять почему при нажатии кнопок не обновляются данные окна. Кто может прочитать мой код и подсказать где ошибка Программа берет данные и вставляет их в QLabel мой код
import sys from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import *from PyQt5.QtGui import * from PyQt5.QtCore import * import pymysql pymysql.install_as_MySQLdb() import MySQLdb class Winop(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) db = MySQLdb.connect("0.0.0.0", "im", "", "app") self.kolstrok = 1 cursor = db.cursor() cursor.execute("select count(*) from list_device") self.kolnew = cursor.fetchone()[0] self.Bazaset() def Bazaset(self): ip = 0 self.Winset() try: db = MySQLdb.connect("0.0.0.0", "im", "", "app") cursor = db.cursor() cursor.execute("select device_id, ip from list_device WHERE device_id=" +str(self.kolstrok)) for row_ip in cursor.fetchall(): ip = row_ip[1] cursor.execute("select * from _data_in_memory WHERE device_id=" +str(self.kolstrok)) self.label.lab = QtWidgets.QLabel(self) font = QtGui.QFont() font.setFamily("Times New Roman") self.setFont(font) font.setPointSize(10) self.label.lab.setFont(font) self.label.lab.setGeometry(QtCore.QRect(10, 20, 295, 20)) self.label.lab.setText(ip) for row_dan in cursor.fetchall(): self.label.lab1 = QtWidgets.QLabel(self) self.label.lab1.setGeometry(QtCore.QRect(10, 40, 140, 20)) self.label.lab1.setText("internal temperature °C") self.label.lab11 = QtWidgets.QLabel(self) self.label.lab11.setGeometry(QtCore.QRect(160, 40, 100, 20)) self.label.lab11.setText(row_dan[2]) db.close() except MySQLdb.Error as e: QMessageBox.about(self, 'Connection', 'Failed To Connect Database') sys.exit(1) def Winset(self): self.window_height = 300 self.window_width = 500 self.setObjectName("menu") font = QtGui.QFont() font.setFamily("Times New Roman") self.setFont(font) font.setPointSize(10) font.setBold(True) font.setWeight(75) self.setFixedSize(self.window_height, self.window_width) self.setWindowIcon(QIcon('logo1.png')) self.setWindowTitle("Teco monitoring") oImage = QImage("6706.jpg") sImage = oImage.scaled(QSize(self.window_height, self.window_width)) palette = QPalette() palette.setBrush(QPalette.Window, QBrush(sImage)) self.setPalette(palette) self.label = QtWidgets.QLabel(self) self.label.setFont(font) self.label.setGeometry(QtCore.QRect(100, 5, 101, 20)) self.label.setText("Current values") self.previous = QtWidgets.QPushButton(self) self.previous.setGeometry(QtCore.QRect(20, 450, 70, 23)) self.previous.setFont(font) self.previous.setObjectName("Previous") self.previous.clicked.connect(self.minus) self.previous.setText("Previous") self.next = QtWidgets.QPushButton(self) self.next.setGeometry(QtCore.QRect(200, 450, 70, 23)) self.next.setFont(font) self.next.setObjectName("Next") self.next.clicked.connect(self.plus) self.next.setText("Next") def plus(self): self.kolstrok = self.kolstrok + 1 if (self.kolstrok > self.kolnew): self.kolstrok = 1 else: self.kolstrok = 2 self.Bazaset() def minus(self): self.kolstrok = self.kolstrok - 1 if (self.kolstrok == 0): self.kolstrok = 1 self.Bazaset() # END ---------------------------------------------- if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) F2_window = Winop() F2_window.show() sys.exit(app.exec_())
Отредактировано FishHook (Июль 16, 2019 15:31:55)
Офлайн
dima_ikar
не могу понять почему при нажатии кнопок не обновляются данные окнаНу отлично, зачем вы такую портянку вывалили? Конект к базе, шрифты, иконки - это все не имеет отношения к вопросу, и просто запутывает. Сделайте просто одно окно, даже без заголовка, с одной кнопкой и с одним лэйблом. Сделать хэндлер нажатия на кнопку, который одновляет лэйбл. Покажите код.
Офлайн
class Winop(QWidget):вы реально с такой табуляцией пишете? где отступы?
def __init__(self, parent=None):
QWidget.__init__(self, parent)
db = MySQLdb.connect(“0.0.0.0”, “im”, “”, “app”)
self.kolstrok = 1
Офлайн
vic57Нет табуляция у меня нормальная в коде
Офлайн
dima_ikarЧтобы это понять, ты должен вставить print'ы во всех местах, где протекают данные при нажатии кнопки, а потом запустить программу из консоли, чтобы эти print'ы в консоль вывелись. И там нужно смотреть и убеждаться, что у тебя правильно всё срабатывает.
не могу понять почему при нажатии кнопок не обновляются данные окна
dima_ikarМы не можем взять твой код, скопировать его себе и запустить. Он не будет работать. Почему? Потому что отступы у тебя неправильные. Обычно мы копируем его себе, подменяем базу данных на пустышку, запускаем и смотрим, как работают кнопки.
Нет табуляция у меня нормальная в коде
Отредактировано py.user.next (Июль 17, 2019 03:14:12)
Офлайн
from PyQt5 import QtGui from PyQt5.QtWidgets import QApplication, QDialog, QPushButton, QMessageBox import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * import pymysql.cursors import pymysql pymysql.install_as_MySQLdb() import MySQLdb class Winop(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) db = MySQLdb.connect("", "", "", "") # QMessageBox.about(self, 'Connection', 'Database Connected Successfully') self.kolstrok = 1 cursor = db.cursor() cursor.execute("select count(*) from list_device") self.kolnew = cursor.fetchone()[0] self.Bazaset() def Bazaset(self): ip = 0 self.Winset() # db------------------------------------------------------------------------------------ try: db = MySQLdb.connect("", "", "", "") cursor = db.cursor() cursor.execute("select device_id, ip from list_device WHERE device_id=" +str(self.kolstrok)) for row_ip in cursor.fetchall(): ip = row_ip[1] cursor.execute("select * from _data_in_memory WHERE device_id=" +str(self.kolstrok)) self.label.lab = QtWidgets.QLabel(self) font = QtGui.QFont() font.setFamily("Times New Roman") self.setFont(font) font.setPointSize(10) self.label.lab.setFont(font) self.label.lab.setGeometry(QtCore.QRect(10, 20, 295, 20)) self.label.lab.setText("Ip " + ip) print(ip) for row_dan in cursor.fetchall(): self.label.lab1 = QtWidgets.QLabel(self) self.label.lab1.setGeometry(QtCore.QRect(10, 40, 140, 20)) self.label.lab1.setText("internal temperature В°C") self.label.lab11 = QtWidgets.QLabel(self) self.label.lab11.setGeometry(QtCore.QRect(160, 40, 100, 20)) self.label.lab11.setText(row_dan[2]) db.close() except MySQLdb.Error as e: QMessageBox.about(self, 'Connection', 'Failed To Connect Database') sys.exit(1) # db -------------------------------------------------------------------------------- def Winset(self): self.window_height = 300 self.window_width = 500 self.setObjectName("menu") font = QtGui.QFont() font.setFamily("Times New Roman") self.setFont(font) font.setPointSize(10) font.setBold(True) font.setWeight(75) self.setFixedSize(self.window_height, self.window_width) self.setWindowIcon(QIcon('logo1.png')) self.setWindowTitle("Teco monitoring") oImage = QImage("6706.jpg") sImage = oImage.scaled(QSize(self.window_height, self.window_width)) palette = QPalette() palette.setBrush(QPalette.Window, QBrush(sImage)) self.setPalette(palette) self.label = QtWidgets.QLabel(self) self.label.setFont(font) self.label.setGeometry(QtCore.QRect(100, 5, 101, 20)) self.label.setText("Current values") self.previous = QtWidgets.QPushButton(self) self.previous.setGeometry(QtCore.QRect(20, 450, 70, 23)) self.previous.setFont(font) self.previous.setObjectName("Previous") self.previous.clicked.connect(self.minus) self.previous.setText("Previous") self.next = QtWidgets.QPushButton(self) self.next.setGeometry(QtCore.QRect(200, 450, 70, 23)) self.next.setFont(font) self.next.setObjectName("Next") self.next.clicked.connect(self.plus) self.next.setText("Next") def plus(self): self.kolstrok = self.kolstrok + 1 if (self.kolstrok > self.kolnew): self.kolstrok = 1 else: self.kolstrok = 2 self.Bazaset() def minus(self): self.kolstrok = self.kolstrok - 1 if (self.kolstrok == 0): self.kolstrok = 1 self.Bazaset() # END ------------------------------------------------------------------------ if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) F2_window = Winop() F2_window.show() sys.exit(app.exec_())
Офлайн
py.user.next
Офлайн
1) Используй дизайнер
2) В методе Bazaset у тебя шизофрения. Сделай виджет нормальной таблицы и выводи в него данные, а не создавай кучу QLabel-ов.
Офлайн
Офлайн
Вот мой пример на таблице - блин что я делаю не так
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import * from PyQt5.QtGui import * import time from PyQt5 import QtCore from PyQt5.QtCore import * from PyQt5.QtWidgets import QApplication, QTableView from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * import pymysql.cursors import pymysql pymysql.install_as_MySQLdb() import MySQLdb from PyQt5.QtCore import Qt from PyQt5.QtWidgets import (QApplication, QDialog, QDialogButtonBox, QHBoxLayout, QMessageBox, QPushButton, QTableView) from PyQt5.QtSql import QSqlTableModel from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QTableView from PyQt5.QtSql import QSqlTableModel try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s class Widget(QtWidgets.QWidget): def __init__(self): super().__init__() self.starw() def starw(self): self.window_height = 300 self.window_width = 600 self.setFixedSize(self.window_height, self.window_width) self.setWindowIcon(QIcon('logo1.png')) self.setWindowTitle("Teco monitoring") layout = QtWidgets.QVBoxLayout(self) btn_layout = QtWidgets.QHBoxLayout() btn1 = QtWidgets.QPushButton("Previous") btn2 = QtWidgets.QPushButton("Quit") btn3 = QtWidgets.QPushButton("Next") btn_layout.addWidget(btn1) btn_layout.addWidget(btn2) btn_layout.addWidget(btn3) btn1.clicked.connect(self.minus) btn2.clicked.connect(QCoreApplication.instance().quit) btn3.clicked.connect(self.plus) table = QtWidgets.QTableWidget() table.setRowCount(6) table.setColumnCount(2) table.setHorizontalHeaderLabels(["Mark", "Devise"]) table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) layout.addWidget(table) layout.addLayout(btn_layout) self.baza(table) def baza(self, table): self.kolstrok = 1 db = MySQLdb.connect("", "", "", "") # print("connect DB successful!!") cursor = db.cursor() cursor.execute("select * from _data_in_memory WHERE device_id=" + str(self.kolstrok)) for dan in cursor.fetchall(): print(self.kolstrok) table.setItem(0, 0, QTableWidgetItem("IP")) table.setItem(0, 1, QTableWidgetItem(str(dan[0]))) table.setItem(1, 0, QTableWidgetItem("Titul")) table.setItem(1, 1, QTableWidgetItem(str(self.kolstrok))) table.setItem(2, 0, QTableWidgetItem("Model")) table.setItem(2, 1, QTableWidgetItem(dan[2])) table.setItem(3, 0, QTableWidgetItem("Mame")) table.setItem(3, 1, QTableWidgetItem(dan[3])) table.setItem(4, 0, QTableWidgetItem("Regoin")) table.setItem(4, 1, QTableWidgetItem(dan[4])) table.setItem(5, 0, QTableWidgetItem("Adres")) table.setItem(5, 1, QTableWidgetItem(dan[5])) def plus(self): self.kolstrok = str(self.kolstrok + 1) if (self.kolstrok > self.kolnew): self.kolstrok = 1 else: self.kolstrok = 2 print(self.kolstrok) self.baza() def minus(self): self.kolstrok = str(self.kolstrok - 1) if (self.kolstrok == 0): self.kolstrok = 1 print(self.kolstrok) self.baza() if __name__ == '__main__': app = QtWidgets.QApplication([]) w = Widget() w.show() app.exec()
Офлайн