파이썬 3.6 PyQt5 질문
# list.py 와 ui와 view.py 에 관한 질문입니다. PyQt5로 작업하였고, pymysql 을 사용하였습니다. 고수님들의 답변 부탁드립니다 ㅠ
==list.py==
# coding: utf-8
import sys
import os
from PyQt5 import QtWidgets
from PyQt5 import QtGui
from PyQt5 import uic
from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSlot
import pymysql
# MySQL Connection 연결
conn = pymysql.connect(host='localhost', user='test', password='',
db='test', charset='utf8')
# Connection 으로부터 Cursor 생성
curs = conn.cursor()
# SQL문 실행
sql = "select * from customer"
curs.execute(sql)
# 데이타 Fetch
rows = curs.fetchall()
# Connection 닫기
conn.close()
class Form(QtWidgets.QDialog):
def __init__(self, parent=None):
QtWidgets.QDialog.__init__(self, parent)
self.ui = uic.loadUi("list.ui", self)
self.ui.show()
self.ui.label_2.setText(rows[0][1]) # 김정수
self.ui.label_3.setText(rows[1][1]) # 강수정
self.ui.label_4.setText(rows[2][1]) # 이성진
self.ui.label_5.setText(rows[3][1]) # 홍대기
@pyqtSlot()
def write(self):
os.system('write.py');
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Form()
sys.exit(app.exec())
# 질문 1
# 여기서 self.ui.label_2.setText(rows[0][1]) 부분을 for 문으로 10개를 출력하려고 합니다. 그런데 그 방법을 모르겠습니다.. 그래서 지금은 일일이 저렇게 출력해놓기만 했습니다.. 어떻게 하면 10개를 저렇게 안 찍고 for 문으로 돌릴 수 있을까요? # 원하는 기능은 page= 1 이면, 0, 10 까지 출력하고, page=2 이면 10,20 .. 이런식으로 출력하길 원합니다.# 질문 2
# 그리고 또 하고자 하는 것은 self.ui.label_2.setText(rows[0][1]) 을 클릭했을때 view.py 를 호출하면서 변수를 넘기고 싶습니다. 한마디로 뷰페이지로 링크되게 하는 기능을 원하는데 파이썬이라 이 기능을 찾고는 있는데 어떻게 이것을 적용할 수 있을까요?# 질문 3
# 여기까지 list.py 에 대한 물음입니다. (그리고 Qt Designer 로 만들었기 때문에, list.ui 를 ui로 불러오는 방식을 취했는데, 만약 ui를 py 화 시켜서 작업해야한다면, 거기서도 막히는게 있었습니다. 그것은 write 함수의 정의에 대한 부분으로 에러가 먼저 출력이 되어서 거기서부터 계속 헤매고 있습니다. 도와주세요... # cmd 에서 AttributeError: 'QDialog' object has no attribute 라고 뜨면서 에러가 납니다..# list.ui를 py 화 시켰을 때는 아래 코드와 같습니다.
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'C:\Users\Fortis-Aaron\AppData\Local\Programs\Python\Python36-32\Scripts\list.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 300)
self.label = QtWidgets.QLabel(Dialog)
self.label.setGeometry(QtCore.QRect(60, 30, 281, 31))
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(Dialog)
self.label_2.setGeometry(QtCore.QRect(40, 60, 321, 21))
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.label_3 = QtWidgets.QLabel(Dialog)
self.label_3.setGeometry(QtCore.QRect(40, 80, 321, 21))
self.label_3.setAlignment(QtCore.Qt.AlignCenter)
self.label_3.setObjectName("label_3")
self.label_4 = QtWidgets.QLabel(Dialog)
self.label_4.setGeometry(QtCore.QRect(40, 100, 321, 21))
self.label_4.setAlignment(QtCore.Qt.AlignCenter)
self.label_4.setObjectName("label_4")
self.label_5 = QtWidgets.QLabel(Dialog)
self.label_5.setGeometry(QtCore.QRect(40, 120, 321, 21))
self.label_5.setAlignment(QtCore.Qt.AlignCenter)
self.label_5.setObjectName("label_5")
self.pushButton = QtWidgets.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(310, 260, 75, 23))
self.pushButton.setObjectName("pushButton")
self.retranslateUi(Dialog)
self.pushButton.clicked.connect(Dialog.write) # 이 부분을 주석하면 잘되긴 하지만 write 글쓰기 함수를 실행할 수 없습니다..
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label.setText(_translate("Dialog", "제목"))
self.label_2.setText(_translate("Dialog", "제목~"))
self.label_3.setText(_translate("Dialog", "제목~"))
self.label_4.setText(_translate("Dialog", "제목~"))
self.label_5.setText(_translate("Dialog", "제목~"))
self.pushButton.setText(_translate("Dialog", "글쓰기"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
###################################
# ui를 py화 시킨 이것을 통해서 write 함수에 대한 에러 부분이 해결되고, for 문을 돌려서 self.label_2.setText(_translate("Dialog", "제목~")) 를 페이지에 따라 10개를 출력할 수 있다면 좋겠습니다...ㅜ
###################################
# 질문 4
# 마지막으로 list.py 에서 '글쓰기' 버튼을 누르면 write 함수가 실행되어서 write.py 가 호출되었으면 좋겠습니다. 이 때, 저는 열려 있는 list.py 를 닫고 싶습니다. 그런데 닫혀지지 않는데 sys.exit() 를 써봐도 부모창을 닫는 기능을 찾지 못했는데요.. 이런 경우 어떻게 해결할 수 있을까요ㅠ?...? 부탁드립니다...ㅠㅠ# 최종적으로 원하는 것은 파이썬, PyQt5 를 통해서 게시판 윈도우 프로그램 완성입니다. 웹을 통해서 게시판을 만드는 것은 그렇게 어렵지 않았는데 파이썬을 통해서, GUI 프로그램 통해서 윈도우 프로그램으로 만드려니 이것저것 질문을 많이 하게 되는데요.. 답변 부탁드립니다....ㅠㅠ
# list.py(목록페이지), write.py(글쓰기 페이지), view.py(뷰 페이지)
첨부 | 파일 크기 |
---|---|
uiui.png | 32.8 KB |
여태까지 올렸던 질문 글에서 왜 최종 목적이 이런
여태까지 올렸던 질문 글에서 왜 최종 목적이 이런 거란 걸 밝히지 않으셨는지 모르겠지만, 그것 때문에 좀 혼란스럽게 코드를 짠 부분이 없지는 않은 것 같습니다.
foreach 문법, for x in y:가 아마 통할 겁니다.
QLabel의 mousePressEvent()에 이벤트 핸들러를 추가하세요.
ui_list.py의 맨 첫 줄에 써 있는 "# WARNING! All changes made in this file will be lost!"는 장식이 아닙니다. Qt의 시그널/슬롯 개념은 일단 이해하셨나요? 모든 GUI 요소와 상호 작용하는 슬롯의 이름은 on_(objectName)_(signalName) 형식을 따릅니다. write 함수 위에다가 그냥 pyQtSlot만 붙일 게 아니라 name="on_pushButton_clicked"를 추가해 주면 됩니다. 자세한 건 http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html 페이지를 참조하세요.
list.py 쪽에서 write.py를 호출한 다음에 list.py를 스스로 끝내면 되긴 하는데, 어떤 GUI 프로그램이 그렇게 하던가요? 대부분 GUI 프로그램은 부모 창에서 자식 창을 호출하더라도 부모 창이 사라지지 않습니다. 이전 질문글 답 중에 system() 함수를 쓰라는 답글이 있어서 그걸 따르고 계신 것 같은데, 이건 list.exe에서 write.exe를 호출한 다음 list.exe를 종료시키는 것과 비슷한 행동을 하려는 겁니다. write.py를 import한 다음 거기에 있는 함수를 호출시키는 형태로 구현하는 게 GUI 세상의 정석입니다. https://stackoverflow.com/questions/46815926/open-other-window-with-button-in-pyqt5
그리고 다음부터는 코드를 올리실 때 < code > (공백 제거) 태그로 감싸서 올려 주세요.
감사합니다
감사합니다. 답글 달아주셔서 어떻게 만들어 볼 수 있을 것 같습니다. 고맙습니다!
https://kldp.org/node/158191
https://kldp.org/node/158191
먼저 읽어보시고 질문 하세요.
들여쓰기가 다른 언어에서는 선택사항이지만, 파이썬에서는 필수라는 것을 주의하세요.
세벌 https://sebuls.blogspot.kr/
알려주셔서 감사합니다.
감사합니다.
댓글 달기