单击更改 QPushButton 文本
changing QPushButton text on click
我正在编写一个简单的 GUI 程序,需要我的按钮在单击时更改文本。我像在示例中一样对其进行了编码,但它不起作用。
示例代码:
class MyWidget(QtWidgets.QWidget):
def __init__(self):
QtWidgets.QWidget.__init__(self)
self.hello = ["Hallo Welt", "你好,世界", "Hei maailma",
"Hola Mundo", "Привет мир"]
self.button = QtWidgets.QPushButton("Click me!")
self.text = QtWidgets.QLabel("Hello World")
self.text.setAlignment(QtCore.Qt.AlignCenter)
self.layout = QtWidgets.QVBoxLayout()
self.layout.addWidget(self.text)
self.layout.addWidget(self.button)
self.setLayout(self.layout)
self.button.clicked.connect(self.magic)
def magic(self):
self.text.setText(random.choice(self.hello))
我的代码:
class Form(QWidget):
def __init__(self):
super(Form, self).__init__()
# Font
r_one = QFont("RussoOne-Regular", 40, QFont.Bold)
# Buttons
self.pvz_p_score = QPushButton('0')
self.pvz_z_score = QPushButton('0')
self.pvt_p_score = QPushButton('0')
self.pvt_t_score = QPushButton('0')
self.pvp_p1_score = QPushButton('0')
self.pvp_p2_score = QPushButton('0')
buttons = [self.pvz_p_score,
self.pvz_z_score,
self.pvt_p_score,
self.pvt_t_score,
self.pvp_p1_score,
self.pvp_p2_score]
for b in buttons:
b.setStyleSheet('QPushButton {background-color: #8ffe09;\
color: black;\
border: none}')
b.setFlat(True)
b.setIconSize(QSize(100,100))
b.setFont(r_one)
b.setContextMenuPolicy(Qt.CustomContextMenu)
b.clicked.connect(self.left_click)
b.customContextMenuRequested.connect(self.right_click)
...
def left_click(self):
self.text.setText(int(self.text)+1)
def right_click(self):
if int(self.text) > 0: button.text.setText(int(self.text)-1)
但是,在我的例子中,self
对应于 Form
,而在示例中它链接到 button
。有什么想法吗?
self.text
指的是 QLabel 小部件。因此,它无法转换为整数供您比较。
- QLabel 的
text()
及其方法 setText()
使用字符串,而不是整数。要设置文本,您可以将数字转换为字符串,或使用 setNum()
,它接受整数和浮点值(但没有 num()
函数)。
def left_click(self):
self.text.setText(str(int(self.text.text()) + 1))
# alternatively:
# self.text.setNum(int(self.text.text()) + 1)
def right_click(self):
if int(self.text.text()) > 0:
button.text.setText(str(int(self.text.text()) - 1))
# alternatively:
# button.text.setNum(int(self.text.text()) - 1)
请注意,我假设文本存在并且可以转换为整数。
好吧,这个问题有点愚蠢,我搞砸了一些基本的 python 东西,但现在已经解决了。希望对大家有所帮助。
首先,self.text
不是 class Form
的字段,因为 没有这样的字段 ,如示例所示。相反,对于我想做的,我需要以某种方式将按钮对象传递给函数并像 button.text()
和 button.setText()
.
一样访问它
由于我所有的按钮都存储在列表 buttons
中,我可以通过它轻松地进行迭代,因此我决定创建 2 个 return 函数:
for b in buttons:
# I skipped style-related code
b.clicked.connect(self.get_left_click(b))
b.customContextMenuRequested.connect(self.get_right_click(b))
...
def get_left_click(self, button):
def left_click(self):
button.setText(str(int(button.text())+1))
return left_click
def get_right_click(self, button):
def right_click(self):
if int(button.text()) > 0: button.setText(str(int(button.text())-1))
return right_click
此外,QPushButton.setText()
不支持整数,所以我不得不将其转换为str(...)
P.S。我将不胜感激更好的解决方案
我正在编写一个简单的 GUI 程序,需要我的按钮在单击时更改文本。我像在示例中一样对其进行了编码,但它不起作用。
示例代码:
class MyWidget(QtWidgets.QWidget):
def __init__(self):
QtWidgets.QWidget.__init__(self)
self.hello = ["Hallo Welt", "你好,世界", "Hei maailma",
"Hola Mundo", "Привет мир"]
self.button = QtWidgets.QPushButton("Click me!")
self.text = QtWidgets.QLabel("Hello World")
self.text.setAlignment(QtCore.Qt.AlignCenter)
self.layout = QtWidgets.QVBoxLayout()
self.layout.addWidget(self.text)
self.layout.addWidget(self.button)
self.setLayout(self.layout)
self.button.clicked.connect(self.magic)
def magic(self):
self.text.setText(random.choice(self.hello))
我的代码:
class Form(QWidget):
def __init__(self):
super(Form, self).__init__()
# Font
r_one = QFont("RussoOne-Regular", 40, QFont.Bold)
# Buttons
self.pvz_p_score = QPushButton('0')
self.pvz_z_score = QPushButton('0')
self.pvt_p_score = QPushButton('0')
self.pvt_t_score = QPushButton('0')
self.pvp_p1_score = QPushButton('0')
self.pvp_p2_score = QPushButton('0')
buttons = [self.pvz_p_score,
self.pvz_z_score,
self.pvt_p_score,
self.pvt_t_score,
self.pvp_p1_score,
self.pvp_p2_score]
for b in buttons:
b.setStyleSheet('QPushButton {background-color: #8ffe09;\
color: black;\
border: none}')
b.setFlat(True)
b.setIconSize(QSize(100,100))
b.setFont(r_one)
b.setContextMenuPolicy(Qt.CustomContextMenu)
b.clicked.connect(self.left_click)
b.customContextMenuRequested.connect(self.right_click)
...
def left_click(self):
self.text.setText(int(self.text)+1)
def right_click(self):
if int(self.text) > 0: button.text.setText(int(self.text)-1)
但是,在我的例子中,self
对应于 Form
,而在示例中它链接到 button
。有什么想法吗?
self.text
指的是 QLabel 小部件。因此,它无法转换为整数供您比较。- QLabel 的
text()
及其方法setText()
使用字符串,而不是整数。要设置文本,您可以将数字转换为字符串,或使用setNum()
,它接受整数和浮点值(但没有num()
函数)。
def left_click(self):
self.text.setText(str(int(self.text.text()) + 1))
# alternatively:
# self.text.setNum(int(self.text.text()) + 1)
def right_click(self):
if int(self.text.text()) > 0:
button.text.setText(str(int(self.text.text()) - 1))
# alternatively:
# button.text.setNum(int(self.text.text()) - 1)
请注意,我假设文本存在并且可以转换为整数。
好吧,这个问题有点愚蠢,我搞砸了一些基本的 python 东西,但现在已经解决了。希望对大家有所帮助。
首先,self.text
不是 class Form
的字段,因为 没有这样的字段 ,如示例所示。相反,对于我想做的,我需要以某种方式将按钮对象传递给函数并像 button.text()
和 button.setText()
.
由于我所有的按钮都存储在列表 buttons
中,我可以通过它轻松地进行迭代,因此我决定创建 2 个 return 函数:
for b in buttons:
# I skipped style-related code
b.clicked.connect(self.get_left_click(b))
b.customContextMenuRequested.connect(self.get_right_click(b))
...
def get_left_click(self, button):
def left_click(self):
button.setText(str(int(button.text())+1))
return left_click
def get_right_click(self, button):
def right_click(self):
if int(button.text()) > 0: button.setText(str(int(button.text())-1))
return right_click
此外,QPushButton.setText()
不支持整数,所以我不得不将其转换为str(...)
P.S。我将不胜感激更好的解决方案