python - 添加调用窗口时弹出窗口写入/关闭代码停止工作,为什么?
问题描述
第一个示例程序运行良好。当用户单击排列的 QLineEdit 单元格之一时,程序会打开一个 NumPad,当用户使用鼠标选择数字并按“Enter”时,该数字将放置在选定的 QLineEdit 单元格中,并且 NumPad 关闭。但是,当在第二个程序中添加调用屏幕以打开屏幕“ss”时,“ss.lVal[(...”和“ss.numpad.close()”行停止工作。
工作示例代码:
#!/usr/bin/env python
import sys
from pprint import pprint
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QVBoxLayout
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QGridLayout
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtCore import pyqtSignal
from PyQt5 import QtCore, QtGui, QtWidgets
# Global variables
# Data Select - 3=3 Data Rows,4=4 Data Rows,5=5 DataRows
gvDataSel = 3
gvPickX = 0
gvPickY = 0
class extQLineEdit(QLineEdit):
clicked=pyqtSignal()
def __init__(self,parent):
QLineEdit.__init__(self,parent)
def mousePressEvent(self,QMouseEvent):
self.clicked.emit()
class wdScoreSheet(QWidget):
def __init__(self):
super(wdScoreSheet, self).__init__()
global gvDataSel
self.resize(400, 300)
self.numpad = NumPad(self)
# Value array
self.lVal = {}
for i in range(gvDataSel):
for j in range(2):
k = 0
self.lVal[i,j] = extQLineEdit(self)
self.lVal[i,j].setGeometry(QtCore.QRect(((j*140)+10),((i*34)+50), 50, 28))
self.lVal[i,j].clicked.connect(lambda i=i, j=j: self.show_NumPad(i,j))
def show_NumPad(self, parm1, parm2):
global gvPickX
global gvPickY
gvPickX = parm1
gvPickY = parm2
self.numpad.show()
def close(self):
self.numpad.close()
super(wdScoreSheet, self).close()
class NumPad(QWidget):
def __init__(self, parm1):
super(NumPad, self).__init__()
grid_layout = QGridLayout()
self.setLayout(grid_layout)
values = [
'1', '2', '3',
'4', '5', '6',
'7', '8', '9',
'-', '0', 'Enter'
]
positions = [(i, j) for i in range(1,5) for j in range(3)]
# position is an array of tuples
for position, value in zip(positions, values):
if value == '':
continue
button = QPushButton(value)
grid_layout.addWidget(button, *position)
button.clicked.connect(self.btnclick)
self.setWindowTitle('Num Pad')
verticalLayout = QVBoxLayout()
self.lineEdit = QLineEdit()
verticalLayout.addWidget(self.lineEdit)
grid_layout.addLayout(verticalLayout, 0, 0, 1, 3)
def btnclick(self):
sender = self.sender()
#pprint("You Pressed: " + sender.text())
if sender.text() in ['0','1','2','3','4','5','6','7','8','9']:
self.lineEdit.setText(self.lineEdit.text() + sender.text())
if sender.text() in ['-']:
if self.lineEdit.text()[:1] in ['-']:
self.lineEdit.setText(self.lineEdit.text()[-(len(self.lineEdit.text())-1):])
else:
self.lineEdit.setText(sender.text() + self.lineEdit.text())
if sender.text() in ["Enter"]:
if self.lineEdit.text() not in [""]:
ss.lVal[(gvPickX, gvPickY)].setText(self.lineEdit.text())
self.lineEdit.clear()
ss.numpad.close()
if __name__ == "__main__":
app = QApplication(sys.argv)
ss = wdScoreSheet()
ss.show()
sys.exit(app.exec_())
添加了与 MainWindow 相同的代码但不起作用:
#!/usr/bin/env python
import sys
from pprint import pprint
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QVBoxLayout
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QGridLayout
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtCore import pyqtSignal
from PyQt5 import QtCore, QtGui, QtWidgets
# Global variables
# Data Select - 3=3 Data Rows,4=4 Data Rows,5=5 DataRows
gvDataSel = 3
gvPickX = 0
gvPickY = 0
class extQLineEdit(QLineEdit):
clicked=pyqtSignal()
def __init__(self,parent):
QLineEdit.__init__(self,parent)
def mousePressEvent(self,QMouseEvent):
self.clicked.emit()
class wdScoreSheet(QWidget):
def __init__(self):
super(wdScoreSheet, self).__init__()
global gvDataSel
self.resize(400, 300)
self.numpad = NumPad(self)
# Value array
self.lVal = {}
for i in range(gvDataSel):
for j in range(2):
k = 0
self.lVal[i,j] = extQLineEdit(self)
self.lVal[i,j].setGeometry(QtCore.QRect(((j*140)+10),((i*34)+50), 50, 28))
self.lVal[i,j].clicked.connect(lambda i=i, j=j: self.show_NumPad(i,j))
def show_NumPad(self, parm1, parm2):
global gvPickX
global gvPickY
gvPickX = parm1
gvPickY = parm2
self.numpad.show()
def close(self):
self.numpad.close()
super(wdScoreSheet, self).close()
class NumPad(QWidget):
def __init__(self, parm1):
super(NumPad, self).__init__()
grid_layout = QGridLayout()
self.setLayout(grid_layout)
values = [
'1', '2', '3',
'4', '5', '6',
'7', '8', '9',
'-', '0', 'Enter'
]
positions = [(i, j) for i in range(1,5) for j in range(3)]
# position is an array of tuples
for position, value in zip(positions, values):
if value == '':
continue
button = QPushButton(value)
grid_layout.addWidget(button, *position)
button.clicked.connect(self.btnclick)
self.setWindowTitle('Num Pad')
verticalLayout = QVBoxLayout()
self.lineEdit = QLineEdit()
verticalLayout.addWidget(self.lineEdit)
grid_layout.addLayout(verticalLayout, 0, 0, 1, 3)
def btnclick(self):
sender = self.sender()
#pprint("You Pressed: " + sender.text())
if sender.text() in ['0','1','2','3','4','5','6','7','8','9']:
self.lineEdit.setText(self.lineEdit.text() + sender.text())
if sender.text() in ['-']:
if self.lineEdit.text()[:1] in ['-']:
self.lineEdit.setText(self.lineEdit.text()[-(len(self.lineEdit.text())-1):])
else:
self.lineEdit.setText(sender.text() + self.lineEdit.text())
if sender.text() in ["Enter"]:
if self.lineEdit.text() not in [""]:
ss.lVal[(gvPickX, gvPickY)].setText(self.lineEdit.text())
self.lineEdit.clear()
ss.numpad.close()
class wdMainWindow(QMainWindow):
def __init__(self):
super(wdMainWindow, self).__init__()
self.resize(400, 300)
self.pbSHR = QPushButton(self)
self.pbSHR.setText("Open Data Screen")
self.pbSHR.setGeometry(QtCore.QRect(20, 20, 200, 30))
self.pbSHR.clicked.connect(self.pbSHR_clicked)
def pbSHR_clicked(self):
global gvDataSel
gvDataSel = 4
ss = wdScoreSheet()
ss.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
mw = wdMainWindow()
mw.show()
sys.exit(app.exec_())
添加 MainWindow 以调用 ss(打开 wdScoreSheet 的实例)使“ss.lVal[(...”和“ss.numpad.close()”现在失败,为什么?需要更改什么才能使 NumPad 像第一个程序一样工作? 预先感谢您的帮助。
解决方案
推荐阅读
- java - 致命错误编译:无效标志:--release java 8
- flutter - 颤振测试仪..点击不工作。如何解决“Bad state: No element”错误?
- node.js - 进行更改时,Gulp 不会重新编译 sass
- reactjs - InitelliJ Idea、ReactApp 和 Flow:意外令牌
- heroku - Heroku 未在 Okta OAuth 2.0 PKCE VueJs 应用程序中应用环境变量更改
- python - 此代码如何使用数字将字母标识为大写或小写
- python - 使用字符串插值在 for 循环下的多行字符串中追加元素
- c++ - 如何正确将“字符串”转换为“双精度”?
- python - 如何使用 Python 在 imo.im 中自动发送消息?我在网上找不到 imo.im api
- asp.net - 对现有用户进行 Microsoft 身份验证