在 PyQT5 中获取按钮名称
Getting the button name in PyQT5
我正在使用 PyQt5 使用图形用户界面开发一个简单的井字游戏。界面已全部设置好,但我在使用功能时遇到了一些麻烦。界面是一个 3x3 的按钮网格。当您单击其中一个按钮时,它会下拉 X 或 O 选项。无论您单击哪个选项,都会成为按钮的文本。
class App(QMainWindow):
game_board = {
'btn1': '', 'btn2': '', 'btn3': '',
'btn4': '', 'btn5': '', 'btn6': '',
'btn7': '', 'btn8': '', 'btn9': ''
}
def __init__(self):
super().__init__()
self.title = 'Tic-Tac-Toe'
self.top = 100
self.left = 100
self.width = 375
self.height = 375
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.top, self.left, self.width, self.height)
...___...
# buttons that make up the gameboard
self.btn1 = QPushButton(self.game_board['btn1'], self)
self.btn2 = QPushButton(self.game_board['btn2'], self)
self.btn3 = QPushButton(self.game_board['btn3'], self)
self.btn4 = QPushButton(self.game_board['btn4'], self)
self.btn5 = QPushButton(self.game_board['btn5'], self)
self.btn6 = QPushButton(self.game_board['btn6'], self)
self.btn7 = QPushButton(self.game_board['btn7'], self)
self.btn8 = QPushButton(self.game_board['btn8'], self)
self.btn9 = QPushButton(self.game_board['btn9'], self)
self.btns = {'btn1': self.btn1, 'btn2': self.btn2, 'btn3': self.btn3, 'btn4': self.btn4, 'btn5': self.btn5, 'btn6': self.btn6, 'btn7': self.btn7, 'btn8': self.btn8, 'btn9': self.btn9}
x_o_menu = QMenu(self)
x_o_menu.addAction('X', self.x_action)
x_o_menu.addAction('O', self.o_action)
i = 1
for value in self.btns.values():
if i < 4:
value.setGeometry(75*i, 75, 75, 75)
elif i < 7:
value.setGeometry(75*(i-3), 150, 75, 75)
elif i < 10:
value.setGeometry(75*(i-6), 225, 75, 75)
i += 1
value.setMenu(x_o_menu)
self.show()
...___...
def x_action(self):
sender = self.sender()
self.statusBar().showMessage(sender.text() + ' was pressed')
def o_action(self):
pass
到目前为止我发现的最接近的解决方案是使用 self.sender() 但这不是 return 按钮,而是 return 下拉选项 (当我输入这个时,我意识到我可能会使用将 x_action 和 o_action 变成一个方法),但我仍然无法知道要为哪个按钮更新文本。有没有办法在不为每个按钮提供唯一菜单的情况下做到这一点?
一个 QMenu,就像一个 QAction,可以被任何parentshown/used。它也可以在没有任何实际 parent 的情况下显示。所以你的做法实际上是无效的。
由于您的看板显然具有有限范围的按钮,因此向每个按钮添加 唯一 菜单不会产生那么大的开销,因此可以创建单独的菜单每个按钮。
不过,更好的方法是创建 QPushButton 的子class 并为该按钮添加唯一的 QMenu。然后您需要为按钮创建自定义信号 class,您可以使用自定义签名或最终使用 lambda 从主程序连接该信号。
请注意,不鼓励为 QMainWindow 创建 direct child 小部件,以及使用固定几何图形;作为文档 suggests:
Note: Creating a main window without a central widget is not supported. You must have a central widget even if it is just a placeholder.
您应该正确地创建一个 中央小部件 (一个基本的 QWidget 就足够了),然后为该中央小部件使用 setCentralWidget()
and set up a layout manager。 然后,您可以将按钮添加到该布局。
我正在使用 PyQt5 使用图形用户界面开发一个简单的井字游戏。界面已全部设置好,但我在使用功能时遇到了一些麻烦。界面是一个 3x3 的按钮网格。当您单击其中一个按钮时,它会下拉 X 或 O 选项。无论您单击哪个选项,都会成为按钮的文本。
class App(QMainWindow):
game_board = {
'btn1': '', 'btn2': '', 'btn3': '',
'btn4': '', 'btn5': '', 'btn6': '',
'btn7': '', 'btn8': '', 'btn9': ''
}
def __init__(self):
super().__init__()
self.title = 'Tic-Tac-Toe'
self.top = 100
self.left = 100
self.width = 375
self.height = 375
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.top, self.left, self.width, self.height)
...___...
# buttons that make up the gameboard
self.btn1 = QPushButton(self.game_board['btn1'], self)
self.btn2 = QPushButton(self.game_board['btn2'], self)
self.btn3 = QPushButton(self.game_board['btn3'], self)
self.btn4 = QPushButton(self.game_board['btn4'], self)
self.btn5 = QPushButton(self.game_board['btn5'], self)
self.btn6 = QPushButton(self.game_board['btn6'], self)
self.btn7 = QPushButton(self.game_board['btn7'], self)
self.btn8 = QPushButton(self.game_board['btn8'], self)
self.btn9 = QPushButton(self.game_board['btn9'], self)
self.btns = {'btn1': self.btn1, 'btn2': self.btn2, 'btn3': self.btn3, 'btn4': self.btn4, 'btn5': self.btn5, 'btn6': self.btn6, 'btn7': self.btn7, 'btn8': self.btn8, 'btn9': self.btn9}
x_o_menu = QMenu(self)
x_o_menu.addAction('X', self.x_action)
x_o_menu.addAction('O', self.o_action)
i = 1
for value in self.btns.values():
if i < 4:
value.setGeometry(75*i, 75, 75, 75)
elif i < 7:
value.setGeometry(75*(i-3), 150, 75, 75)
elif i < 10:
value.setGeometry(75*(i-6), 225, 75, 75)
i += 1
value.setMenu(x_o_menu)
self.show()
...___...
def x_action(self):
sender = self.sender()
self.statusBar().showMessage(sender.text() + ' was pressed')
def o_action(self):
pass
到目前为止我发现的最接近的解决方案是使用 self.sender() 但这不是 return 按钮,而是 return 下拉选项 (当我输入这个时,我意识到我可能会使用将 x_action 和 o_action 变成一个方法),但我仍然无法知道要为哪个按钮更新文本。有没有办法在不为每个按钮提供唯一菜单的情况下做到这一点?
一个 QMenu,就像一个 QAction,可以被任何parentshown/used。它也可以在没有任何实际 parent 的情况下显示。所以你的做法实际上是无效的。
由于您的看板显然具有有限范围的按钮,因此向每个按钮添加 唯一 菜单不会产生那么大的开销,因此可以创建单独的菜单每个按钮。
不过,更好的方法是创建 QPushButton 的子class 并为该按钮添加唯一的 QMenu。然后您需要为按钮创建自定义信号 class,您可以使用自定义签名或最终使用 lambda 从主程序连接该信号。
请注意,不鼓励为 QMainWindow 创建 direct child 小部件,以及使用固定几何图形;作为文档 suggests:
Note: Creating a main window without a central widget is not supported. You must have a central widget even if it is just a placeholder.
您应该正确地创建一个 中央小部件 (一个基本的 QWidget 就足够了),然后为该中央小部件使用 setCentralWidget()
and set up a layout manager。 然后,您可以将按钮添加到该布局。