如何在pyqt5中更改按钮文本,当用按键单击时



所以目前我正在PyQt5中创建数独。到目前为止,我有board。py,它只生成新的板子。目前,我正在Play.py上工作,它应该能够单击空方块,并能够通过按下键盘按钮(按键)来改变它。在Play.py中,我已经完成了所有的事情——所有的数字都放在一个板上,我可以点击按钮,它启动了一个按键。但是,按照我的编码方式,所有按钮都存储在一个列表中(我这样做是因为我希望代码看起来干净),并且它只更新最后一个按钮。而不是更新最后一个按钮,我希望它更新最近被点击的按钮。

我已经尝试了很多事情,但我已经把它缩小到目前是找到所有按钮(all_buttons)列表中的按钮的位置,并从那里做一些事情,但我不确定。那么,我怎样才能把按键放在最近按过的按钮上呢?

这是Board.py。它只是生成新的板,没有必要看。

import random
import numpy as np

# populates a row in random spaces
def populate():
row = [0] * 9
num_in_box = random.randint(3, 6)
while True:
spot = random.randint(0, 8)
r = random.randint(1, 9)
if r not in row:
row[spot] = r
if row.count(0) == (9 - num_in_box):
break
return row

# populates a grid in random spaces - has duplicates in column, row and box
mapped = list()
for x in range(9): mapped.append(populate())

# checks every number in column and row and returns numbers in list
def col_row_nums(array, row, col):
check_col = [j for j in array[:, col] if j != 0]
check_row = [i for i in array[row] if i != 0]
if array[row][col] in check_col:
check_col.remove(array[row][col])
return check_col + check_row

# checks every number box and returns numbers in list
def box_nums(array, box_row):
reshaped_box = np.reshape(array, (27, 3))
list_boxes_in_rows = list()
for a in range(3):
for b in range(3):
for c in range(3):
p2 = list(np.reshape((reshaped_box[c::3]), (3, 9)))
for d in range(3): list_boxes_in_rows.append(p2[a])
array_boxes_in_rows = np.array(list_boxes_in_rows)
return [k for k in array_boxes_in_rows[box_row] if k != 0]

# removes any duplicates so each column, row and box all have only one set of numbers 1 - 9
def finalize_board():
box_rows_num = -1
for x in range(9):
for y in range(9):
box_rows_num += 1
arr = np.array(mapped)
possible_nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
col_row_duplicates = list()
box_duplicates = list()
used_nums = set(col_row_nums(arr, x, y)) | set(box_nums(arr, box_rows_num))
for w in used_nums:
col_row_count = col_row_nums(arr, x, y).count(w)
box_count = box_nums(arr, box_rows_num).count(w)
if col_row_count > 1: col_row_duplicates.append(w)
if box_count > 1: box_duplicates.append(w)
if mapped[x][y] in col_row_duplicates or mapped[x][y] in box_duplicates:
remaining_nums = list(set(possible_nums) - set(used_nums))
if len(remaining_nums) > 0: mapped[x][y] = random.choice(remaining_nums)
return mapped

下一个是Play.Py.

import sys
from pynput import keyboard
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
from PyQt5 import QtGui as qtg
import Board

class MainWindow(qtw.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# -------------------------------------------------------------------------------------------
all_buttons = list()
layout = qtw.QGridLayout()
layout.setSpacing(0)
board = Board.finalize_board()
y_num = -1
for x, rows in enumerate(board):
for y, cell in enumerate(rows):
y += 1
if cell == 0: cell = ' '
button = qtw.QPushButton(str(cell), self)
button.setFixedHeight(100)
button.setFixedWidth(100)
layout.addWidget(button, x, y)
if cell == ' ':
button.clicked.connect(lambda: pressed())
button.setStyleSheet('QPushButton {background-color: #e3efff; color: black;}')
else:
button.setEnabled(False)
button.setStyleSheet('QPushButton {background-color: #ebebeb; color: black;}')
all_buttons.append(button)

def pressed():
with keyboard.Events() as events:
# maybe - ?? HOW TO RETURN POSITION OF BUTTON IN ALL_BUTTONS
event = events.get(1e6)
x = event.key
print(str(x))
button.setText(str(x))
self.setLayout(layout)
# -------------------------------------------------------------------------------------------
self.show()

if __name__ == '__main__':
app = qtw.QApplication(sys.argv)
w = MainWindow()
sys.exit(app.exec_())

你就快成功了。使用keyPressEvent点击这里。

import sys
from PyQt5.QtWidgets import (QApplication, QWidget)
from PyQt5.Qt import Qt
class MainWindow(QWidget):
def __init__(self):
super().__init__()

def keyPressEvent(self, event):
print(chr(event.key()))
def test_method(self):
print('Space key pressed')
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = MainWindow()
demo.show()
sys.exit(app.exec_())

event.key()将始终返回一个整数。你可以使用内置的chr(int)函数来获取密钥,问题是我们不能识别除字母和数字以外的密钥。如果还需要其他键,请使用条件。

def keyPressEvent(self, event):
if event.key() == Qt.Key_Space:
print("Space pressed")
# Qt.Key_Shift for shift key, Qt.Key_Control for Ctrl key.

这是最后的代码:read edit2

import sys
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
from PyQt5.QtCore import pyqtSlot
from PyQt5 import QtGui as qtg
import Board

class MainWindow(qtw.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# -------------------------------------------------------------------------------------------
all_buttons = list()
layout = qtw.QGridLayout(self)
layout.setSpacing(0)
board = Board.finalize_board()
y_num = -1
for x, rows in enumerate(board):
for y, cell in enumerate(rows):
y += 1
if cell == 0: cell = ' '
button = qtw.QPushButton(str(cell), self)
button.setFixedHeight(100)
button.setFixedWidth(100)
layout.addWidget(button, x, y)
if cell == ' ':
button.setCursor(qtc.Qt.PointingHandCursor)
button.mousePressEvent = lambda event: self.mousePressEvent(event)
button.setStyleSheet('QPushButton {background-color: #e3efff; color: black;}')
else:
button.setEnabled(False)
button.setStyleSheet('QPushButton {background-color: #ebebeb; color: black;}')
all_buttons.append(button)
self.last_clicked = ''
self.setLayout(layout)
# -------------------------------------------------------------------------------------------
self.show()
def keyPressEvent(self, event):
k = (chr(event.key()))
self.last_clicked.setText(k)
self.last_clicked.setStyleSheet("background-color: #e3efff; color: black;")

def mousePressEvent(self, event):
widget = self.childAt(event.pos())
widget.setStyleSheet("background-color: #e3efff; color: black; border: 1px solid red")
print(widget.pos())
self.last_clicked = widget
return qtw.QWidget.mousePressEvent(self, event)
# -------------------------------------------------------------------------------------------

if __name__ == '__main__':
app = qtw.QApplication(sys.argv)
w = MainWindow()
sys.exit(app.exec_())

现在,当你按下一个键,它更新最近点击按钮的文本。您可能需要在keyPressEventsetText function

中添加一些try。

编辑2:我不知道为什么第一个按钮被选中,我猜mousePressEvent有问题。它首先返回第一个小部件,然后返回被单击的实际按钮。我调整了一些东西,现在工作得很好。

我改变的东西:

  • 我创建了一个新的列表self.available_buttons。它包含所有空的/可点击的按钮。

  • 每当按下空按钮时,代码将遍历列表并搜索last_clicked小部件。如果找到last_clicked小部件,它突出显示按钮并将所有其他按钮更改为normal(没有边框颜色)。


class MainWindow(qtw.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# -------------------------------------------------------------------------------------------
all_buttons = list() # contains all buttons
self.available_buttons = list() # contains clickable buttons
layout = qtw.QGridLayout(self)
layout.setSpacing(0)
board = Board.finalize_board()
y_num = -1
for x, rows in enumerate(board):
for y, cell in enumerate(rows):
y += 1
if cell == 0: cell = ' '
button = qtw.QPushButton(str(cell), self)
button.setFixedHeight(100)
button.setFixedWidth(100)
layout.addWidget(button, x, y)
if cell == ' ':
button.setCursor(qtc.Qt.PointingHandCursor)
button.mousePressEvent = lambda event: self.mousePressEvent(event)
button.setStyleSheet('QPushButton {background-color: #e3efff; color: black;}')
self.available_buttons.append(button) # appends empty buttons to the list
else:
button.setEnabled(False)
button.setStyleSheet('QPushButton {background-color: #ebebeb; color: black;}')
all_buttons.append(button)
self.last_clicked = ''
self.setLayout(layout)
self.show()
# -------------------------------------------------------------------------------------------
def keyPressEvent(self, event):
k = (chr(event.key()))
self.last_clicked.setText(k)
self.last_clicked.setStyleSheet("background-color: #e3efff; color: black;")
def mousePressEvent(self, event):
widget = self.childAt(event.pos())
self.last_clicked = widget
for button in self.available_buttons:  #searches for clicked button
if widget == button:
button.setStyleSheet("background-color: #e3efff; color: black; border: 1px solid red") # adds border to clicked button
else:
button.setStyleSheet("background-color: #e3efff; color: black;") # all the other buttons go back to their normal state
return qtw.QWidget.mousePressEvent(self, event)
# -------------------------------------------------------------------------------------------

相关内容

最新更新