PyQt5 – 火焰计算器

PyQt5 – 火焰计算器

在这篇文章中,我们将看到如何使用PyQt5创建一个火焰计算器。这个火焰计算器根据两个给定名称的算法来评估和预测关系的结果。

FLAMES 是一个流行的游戏,以首字母缩写命名。朋友、恋人、亲情、婚姻、敌人、兄弟姐妹。这个游戏不能准确地预测一个人是否适合你,但与你的朋友玩这个游戏会很有趣。

下面是火焰计算器的样子,如下所示。

PyQt5 - 火焰计算器

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())

输出 :

代码解释

  1. 这段代码从初始化窗口的标题开始。
  2. 接下来,窗口的几何形状被设置为(100, 100, 320, 400)。
  3. 最后,UiComponents()方法被调用。
  4. 这个方法包含的代码将显示窗口中所有的部件。
  5. 第一个要显示的部件是一个文本字段。
  6. 该文本字段的宽度和高度各为50像素。
  7. 该文本字段也将有一个默认值 “Python”。
  8. 接下来,一个按钮被添加到窗口中。
  9. 这个按钮的宽度和高度各为25像素,其默认状态为 “按下”。
  10. 最后,两个标签被添加到窗口中。
  11. 一个标签的宽度和高度各为20像素,其默认状态为 “空”。
  12. 另一个标签的宽度和高度各为30像素,其默认状态为 “加载”。
  13. 该代码首先导入了必要的库,并设置了一个QMainWindow类。
  14. 接下来,代码创建了一个Window对象并设置了它的标题。
  15. 窗口对象还设置了它的几何形状,它被定义为(100, 100, 320, 400)。
  16. 最后,代码在Window对象上调用UiComponents()方法,以显示其所有的部件。
  17. UiComponents()方法负责处理应用程序中所有的用户界面(UI)组件。
  18. 这个方法将在本教程的后面详细讨论。
  19. 代码从创建两个标签开始,即name1和name2。
  20. 第一个标签,name1_label,将被用来显示玩家的名字。
  21. 第二个标签,name2_label,将用于显示玩家的第二个名字。
  22. 接下来,代码创建了两个行编辑:一个用于输入玩家的第一个名字,另一个用于输入玩家的第二个名字。
  23. 这两个行编辑都有自己的几何图形(宽度和高度),并被定位在不同的坐标上(距窗口左上角160像素,距右下角70像素)。
  24. 最后,创建一个标签来显示用户输入的结果:name3_label。
  25. 该代码创建了两个QLabel对象,name1_label和name2_label。
  26. 第一个标签将显示玩家的名字,而第二个标签将显示玩家的姓氏。
  27. 接下来的一行代码为每个标签创建一个QLineEdit对象。
  28. 线条编辑对象的几何形状设置为160 x 20像素,宽度为150像素,高度为40像素。
  29. 最后,最后一行代码创建一个标签来显示代码的结果。
  30. 这个标签的几何尺寸设置为140 x 40像素,边框和背景颜色分别为黑色和浅灰色。
  31. 代码开始时,创建一个名为self.output的QLabel对象,并将其几何形状设置为20、160、280、60。
  32. 该标签的边框和背景颜色将分别为黑色和白色。
  33. 标签的对齐方式将被设置为Qt.AlignCenter。
  34. 最后,输出标签使用的字体将是Times New Roman 11pt。
  35. 接下来,一个名为self.push的QPushButton对象被创建,其几何形状被设置为80, 260, 140, 50。
  36. 一个点击事件处理程序被附加到按钮上,当它被点击时将调用do_action()函数。
  37. 在这个函数中,两个变量被初始化:name1和name2。
  38. name1将保存第一个输入字段的文本值,而name2将保存第二个输入字段的文本值(假设它们都被填入)。
  39. 现在让我们来看看do_action()。
  40. 这个函数首先使用各自的文本值作为参数来获取name1和name2的引用。
  41. 接下来,执行一个if语句,测试两个变量是否已经被赋值(name1还没有被赋值,因为它最初没有被填充),否则do_action()
  42. 该代码设置了一个名为self.output的QLabel对象,并将其几何尺寸设置为20 x 160像素,边框和背景颜色分别为黑色和白色。
  43. 然后,它将标签的样式表设置为:border : 2px solid black; background : white。
  44. 该代码首先从第一个名字中删除任何空格,然后从第二个名字中删除。
  45. 接下来,它创建了一个函数来删除常见的字符。
  46. 该代码循环浏览list1和list2中的每个字符,检查该字符是否在两个列表中都有。
  47. 如果是,则从 list1 和 list2 中删除该字符,并将两个列表用星号(*)连接起来。
  48. 最后,如果没有找到共同的字符,那么这两个列表就用逗号(,)连接在一起。
  49. 该代码可以总结如下。删除名字中的任何空格。
  50. 创建一个函数来删除常见的字符。
  51. 循环浏览两个列表中的每个字符,检查是否匹配。
  52. 如果发现匹配,从两个列表中删除该字符,并用星号(*)连接它们。
  53. 如果没有找到匹配的字符,就用逗号(,)把它们串联起来。
  54. 该代码从两个字符串中删除了所有的空格和其他常见字符。
  55. 它是通过遍历第一个字符串中的每个字符,然后对第二个字符串做同样的操作。
  56. 如果发现一个共同的字符,它就会从两个列表中删除,并创建一个带有True标志的中间列表。
  57. 如果没有找到共同的字符,那么中间列表就会被附加上False标志。
  58. 该代码的最终结果是两个带有各自标志的列表。
  59. 代码开始时定义了一个叫做 find_relation 的函数。
  60. 这个函数将被用来寻找两个字符串列表之间的关系。
  61. 第一个列表包含世界上所有的人名,第二个列表包含世界上所有的国家名称。
  62. 下一行定义了一个标志变量proceed,它最初被设置为True。
  63. 这意味着我们目前正在循环这个函数,直到它返回False(继续)。
  64. 接下来,我们定义一个while循环,以 “while proceed: “开始。
  65. 在这个循环中,我们对两个列表中的每个字符串调用remove_match_char方法,并将其返回值存入一个名为ret_list的空列表。
  66. 然后我们从ret_list[0]中取出串联的列表,并将其作为con_list存入一个名为result[0]的空列表中。
  67. 我们还从ret_list[1]中取出标志值,并将其作为proceed存储到result[1]中。
  68. 最后,我们使用index(“*”)来获取con-list中的星形字符()的索引号,它分别在p1-list中存储了之前的所有字符,在p2-list中存储了*之后的所有字符。
  69. 然后用len(p1-List)+len(“*”)来获取星号的索引号。
  70. 的代码是一个函数的实现,该函数接收两个列表并返回它们之间的关系。
  71. 该函数首先检查两个列表中是否有共同的字符,然后不断地循环,直到没有共同的字符了。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程