PyQt5 – 火焰计算器
在这篇文章中,我们将看到如何使用PyQt5创建一个火焰计算器。这个火焰计算器根据两个给定名称的算法来评估和预测关系的结果。
FLAMES 是一个流行的游戏,以首字母缩写命名。朋友、恋人、亲情、婚姻、敌人、兄弟姐妹。这个游戏不能准确地预测一个人是否适合你,但与你的朋友玩这个游戏会很有趣。
下面是火焰计算器的样子,如下所示。

GUI实施步骤:
1.创建一个标签,上面写着输入玩家1的名字,并为其设置颜色和几何图形
2.在第一个名字的标签前添加QLineEdit部件,以获得第一个名字
3.同样地,创建另一个标签,上面写着输入球员2的名字,并为其设置颜色和几何形状
4.在这个标签前面添加QLineEdit小组件,以获得第二个名字
5.创建一个标签来显示结果,并设置其边界、几何形状和改变其字体。
6.在底部创建一个按钮,上面写着获取结果。
后端实施步骤:
1.给按钮添加动作
2.在按钮的动作中获取两个玩家的名字
3.删除名字之间的间距
4.调用返回结果的get result方法
5.在获取结果的方法中,调用删除字母的方法,删除常见的字符和它们各自的常见出现。
6.然后得到剩下的字符数,并将FLAMES字母作为[“F”, “L”, “A”, “M”, “E”, “S”]
7.使用我们得到的计数开始删除字母。最后一个字母就是结果,返回结果
8.使用setText方法将结果设置到标签上。
下面是实现的过程。
# importing libraries
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class Window(QMainWindow):
def __init__(self):
super().__init__()
# setting title
self.setWindowTitle("Python ")
# setting geometry
self.setGeometry(100, 100, 320, 400)
# calling method
self.UiComponents()
# showing all the widgets
self.show()
# method for components
def UiComponents(self):
# creating label to tell user enter first name
name1_label = QLabel("Enter Player 1 Name : ", self)
# setting border and color to the label
name1_label.setStyleSheet("border : 1px solid black ;
background : lightgrey;")
# setting geometry
name1_label.setGeometry(10, 20, 140, 40)
# creating label to tell user enter second name
name2_label = QLabel("Enter Player 2 Name : ", self)
# setting border and color to the label
name2_label.setStyleSheet("border : 1px solid black ;
background : lightgrey;")
# setting geometry
name2_label.setGeometry(10, 70, 140, 40)
# creating a line edit to get the first name
self.name1 = QLineEdit(self)
# setting geometry
self.name1.setGeometry(160, 20, 150, 40)
# creating a line edit to get the second name
self.name2 = QLineEdit(self)
# setting geometry
self.name2.setGeometry(160, 70, 150, 40)
# creating a label to show result
self.output = QLabel("Find Relationship Status", self)
# setting geometry to the output label
self.output.setGeometry(20, 160, 280, 60)
# setting border and background color to it
self.output.setStyleSheet("border : 2px solid black;
background : white;")
# setting alignment to output
self.output.setAlignment(Qt.AlignCenter)
# setting font to the output
self.output.setFont(QFont('Times', 11))
# creating push button to get result
self.push = QPushButton("Get Result", self)
# setting geometry tot he button
self.push.setGeometry(80, 260, 140, 50)
# adding action to the push button
self.push.clicked.connect(self.do_action)
# action called by the push button
def do_action(self):
# getting names
name1 = self.name1.text()
name2 = self.name2.text()
# removing spacing form the name
name1.replace(" ", "")
name2.replace(" ", "")
# function for removing common characters
# with their respective occurrences
def remove_match_char(list1, list2):
for i in range(len(list1)):
for j in range(len(list2)):
# if common character is found
# then remove that character
# and return list of concatenated
# list with True Flag
if list1[i] == list2[j]:
c = list1[i]
# remove character from the list
list1.remove(c)
list2.remove(c)
# concatenation of two list elements with *
# * is act as border mark here
list3 = list1 + ["*"] + list2
# return the concatenated list with True flag
return [list3, True]
# no common characters is found
# return the concatenated list with False flag
list3 = list1 + ["*"] + list2
return [list3, False]
# method to find the result
def find_relation(p1_list, p2_list):
# taking a flag as True initially
proceed = True
# keep calling remove_match_char function
# until common characters is found or
# keep looping until proceed flag is True
while proceed:
# function calling and store return value
ret_list = remove_match_char(p1_list, p2_list)
# take out concatenated list from return list
con_list = ret_list[0]
# take out flag value from return list
proceed = ret_list[1]
# find the index of "*" / border mark
star_index = con_list.index("*")
# list slicing perform
# all characters before * store in p1_list
p1_list = con_list[: star_index]
# all characters after * store in p2_list
p2_list = con_list[star_index + 1:]
# count total remaining characters
count = len(p1_list) + len(p2_list)
# list of FLAMES acronym
result = ["Friends", "Love", "Affection", "Marriage", "Enemy", "Siblings"]
# keep looping until only one item
# is not remaining in the result list
while len(result) > 1:
# store that index value from
# where we have to perform slicing.
split_index = (count % len(result) - 1)
# this steps is done for performing
# anticlock-wise circular fashion counting.
if split_index >= 0:
# list slicing
right = result[split_index + 1:]
left = result[: split_index]
# list concatenation
result = right + left
else:
result = result[: len(result) - 1]
# print final result
return result[0]
# calling find relation method
result = find_relation(list(name1), list(name2))
# setting text to the output label
self.output.setText("Relationship : " + result)
# create pyqt5 app
App = QApplication(sys.argv)
# create the instance of our Window
window = Window()
# start the app
sys.exit(App.exec())
输出 :
代码解释 。
- 这段代码从初始化窗口的标题开始。
- 接下来,窗口的几何形状被设置为(100, 100, 320, 400)。
- 最后,UiComponents()方法被调用。
- 这个方法包含的代码将显示窗口中所有的部件。
- 第一个要显示的部件是一个文本字段。
- 该文本字段的宽度和高度各为50像素。
- 该文本字段也将有一个默认值 “Python”。
- 接下来,一个按钮被添加到窗口中。
- 这个按钮的宽度和高度各为25像素,其默认状态为 “按下”。
- 最后,两个标签被添加到窗口中。
- 一个标签的宽度和高度各为20像素,其默认状态为 “空”。
- 另一个标签的宽度和高度各为30像素,其默认状态为 “加载”。
- 该代码首先导入了必要的库,并设置了一个QMainWindow类。
- 接下来,代码创建了一个Window对象并设置了它的标题。
- 窗口对象还设置了它的几何形状,它被定义为(100, 100, 320, 400)。
- 最后,代码在Window对象上调用UiComponents()方法,以显示其所有的部件。
- UiComponents()方法负责处理应用程序中所有的用户界面(UI)组件。
- 这个方法将在本教程的后面详细讨论。
- 代码从创建两个标签开始,即name1和name2。
- 第一个标签,name1_label,将被用来显示玩家的名字。
- 第二个标签,name2_label,将用于显示玩家的第二个名字。
- 接下来,代码创建了两个行编辑:一个用于输入玩家的第一个名字,另一个用于输入玩家的第二个名字。
- 这两个行编辑都有自己的几何图形(宽度和高度),并被定位在不同的坐标上(距窗口左上角160像素,距右下角70像素)。
- 最后,创建一个标签来显示用户输入的结果:name3_label。
- 该代码创建了两个QLabel对象,name1_label和name2_label。
- 第一个标签将显示玩家的名字,而第二个标签将显示玩家的姓氏。
- 接下来的一行代码为每个标签创建一个QLineEdit对象。
- 线条编辑对象的几何形状设置为160 x 20像素,宽度为150像素,高度为40像素。
- 最后,最后一行代码创建一个标签来显示代码的结果。
- 这个标签的几何尺寸设置为140 x 40像素,边框和背景颜色分别为黑色和浅灰色。
- 代码开始时,创建一个名为self.output的QLabel对象,并将其几何形状设置为20、160、280、60。
- 该标签的边框和背景颜色将分别为黑色和白色。
- 标签的对齐方式将被设置为Qt.AlignCenter。
- 最后,输出标签使用的字体将是Times New Roman 11pt。
- 接下来,一个名为self.push的QPushButton对象被创建,其几何形状被设置为80, 260, 140, 50。
- 一个点击事件处理程序被附加到按钮上,当它被点击时将调用do_action()函数。
- 在这个函数中,两个变量被初始化:name1和name2。
- name1将保存第一个输入字段的文本值,而name2将保存第二个输入字段的文本值(假设它们都被填入)。
- 现在让我们来看看do_action()。
- 这个函数首先使用各自的文本值作为参数来获取name1和name2的引用。
- 接下来,执行一个if语句,测试两个变量是否已经被赋值(name1还没有被赋值,因为它最初没有被填充),否则do_action()
- 该代码设置了一个名为self.output的QLabel对象,并将其几何尺寸设置为20 x 160像素,边框和背景颜色分别为黑色和白色。
- 然后,它将标签的样式表设置为:border : 2px solid black; background : white。
- 该代码首先从第一个名字中删除任何空格,然后从第二个名字中删除。
- 接下来,它创建了一个函数来删除常见的字符。
- 该代码循环浏览list1和list2中的每个字符,检查该字符是否在两个列表中都有。
- 如果是,则从 list1 和 list2 中删除该字符,并将两个列表用星号(*)连接起来。
- 最后,如果没有找到共同的字符,那么这两个列表就用逗号(,)连接在一起。
- 该代码可以总结如下。删除名字中的任何空格。
- 创建一个函数来删除常见的字符。
- 循环浏览两个列表中的每个字符,检查是否匹配。
- 如果发现匹配,从两个列表中删除该字符,并用星号(*)连接它们。
- 如果没有找到匹配的字符,就用逗号(,)把它们串联起来。
- 该代码从两个字符串中删除了所有的空格和其他常见字符。
- 它是通过遍历第一个字符串中的每个字符,然后对第二个字符串做同样的操作。
- 如果发现一个共同的字符,它就会从两个列表中删除,并创建一个带有True标志的中间列表。
- 如果没有找到共同的字符,那么中间列表就会被附加上False标志。
- 该代码的最终结果是两个带有各自标志的列表。
- 代码开始时定义了一个叫做 find_relation 的函数。
- 这个函数将被用来寻找两个字符串列表之间的关系。
- 第一个列表包含世界上所有的人名,第二个列表包含世界上所有的国家名称。
- 下一行定义了一个标志变量proceed,它最初被设置为True。
- 这意味着我们目前正在循环这个函数,直到它返回False(继续)。
- 接下来,我们定义一个while循环,以 “while proceed: “开始。
- 在这个循环中,我们对两个列表中的每个字符串调用remove_match_char方法,并将其返回值存入一个名为ret_list的空列表。
- 然后我们从ret_list[0]中取出串联的列表,并将其作为con_list存入一个名为result[0]的空列表中。
- 我们还从ret_list[1]中取出标志值,并将其作为proceed存储到result[1]中。
- 最后,我们使用index(“*”)来获取con-list中的星形字符()的索引号,它分别在p1-list中存储了之前的所有字符,在p2-list中存储了*之后的所有字符。
- 然后用len(p1-List)+len(“*”)来获取星号的索引号。
- 的代码是一个函数的实现,该函数接收两个列表并返回它们之间的关系。
- 该函数首先检查两个列表中是否有共同的字符,然后不断地循环,直到没有共同的字符了。