파이썬 3.6 PyQt5 질문

Sangwoo Jung@Google의 이미지

# 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(뷰 페이지)

File attachments: 
첨부파일 크기
Image icon uiui.png32.8 KB
익명 사용자의 이미지

여태까지 올렸던 질문 글에서 왜 최종 목적이 이런 거란 걸 밝히지 않으셨는지 모르겠지만, 그것 때문에 좀 혼란스럽게 코드를 짠 부분이 없지는 않은 것 같습니다.

Quote:
# 질문 1
# 여기서 self.ui.label_2.setText(rows[0][1]) 부분을 for 문으로 10개를 출력하려고 합니다. 그런데 그 방법을 모르겠습니다.. 그래서 지금은 일일이 저렇게 출력해놓기만 했습니다.. 어떻게 하면 10개를 저렇게 안 찍고 for 문으로 돌릴 수 있을까요? # 원하는 기능은 page= 1 이면, 0, 10 까지 출력하고, page=2 이면 10,20 .. 이런식으로 출력하길 원합니다.

foreach 문법, for x in y:가 아마 통할 겁니다.

Quote:
# 질문 2
# 그리고 또 하고자 하는 것은 self.ui.label_2.setText(rows[0][1]) 을 클릭했을때 view.py 를 호출하면서 변수를 넘기고 싶습니다. 한마디로 뷰페이지로 링크되게 하는 기능을 원하는데 파이썬이라 이 기능을 찾고는 있는데 어떻게 이것을 적용할 수 있을까요?

QLabel의 mousePressEvent()에 이벤트 핸들러를 추가하세요.

Quote:
# 질문 3
# 여기까지 list.py 에 대한 물음입니다. (그리고 Qt Designer 로 만들었기 때문에, list.ui 를 ui로 불러오는 방식을 취했는데, 만약 ui를 py 화 시켜서 작업해야한다면, 거기서도 막히는게 있었습니다. 그것은 write 함수의 정의에 대한 부분으로 에러가 먼저 출력이 되어서 거기서부터 계속 헤매고 있습니다. 도와주세요... # cmd 에서 AttributeError: 'QDialog' object has no attribute 라고 뜨면서 에러가 납니다..

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 페이지를 참조하세요.

Quote:
# 질문 4
# 마지막으로 list.py 에서 '글쓰기' 버튼을 누르면 write 함수가 실행되어서 write.py 가 호출되었으면 좋겠습니다. 이 때, 저는 열려 있는 list.py 를 닫고 싶습니다. 그런데 닫혀지지 않는데 sys.exit() 를 써봐도 부모창을 닫는 기능을 찾지 못했는데요.. 이런 경우 어떻게 해결할 수 있을까요ㅠ?...? 부탁드립니다...ㅠㅠ

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 > (공백 제거) 태그로 감싸서 올려 주세요.

Sangwoo Jung@Google의 이미지

감사합니다. 답글 달아주셔서 어떻게 만들어 볼 수 있을 것 같습니다. 고맙습니다!

세벌의 이미지

https://kldp.org/node/158191
먼저 읽어보시고 질문 하세요.
들여쓰기가 다른 언어에서는 선택사항이지만, 파이썬에서는 필수라는 것을 주의하세요.

Sangwoo Jung@Google의 이미지

감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.