翼度科技»论坛 编程开发 python 查看内容

使用pyqt5制作简单计分桌面应用

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
这是一个自己写的使用pyqt5制作简单计分桌面应用的实例,希望对大家有所帮助。制作这个小程序的起因是因为有个艺术类比赛需要设计这个一个桌面程序,方便统分。
(此程序尚存在部分小bug,请慎用,公开代码只为让小白熟悉如何开发一个简单的桌面计分程序)
ui设计

众所周知,使用pyqt5开发可以直接使用designer来设计界面,所以,我将页面代码直接贴给大家,具体效果截图展示。
比赛准备阶段界面


比赛进行中界面


完整ui代码

为了方便,并没有转成.py形式的文件
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ui version="4.0">
  3. <class>Form</class>
  4. <widget  name="Form">
  5.   <property name="enabled">
  6.    <bool>true</bool>
  7.   </property>
  8.   <property name="geometry">
  9.    <rect>
  10.     <x>0</x>
  11.     <y>0</y>
  12.     <width>1920</width>
  13.     <height>1080</height>
  14.    </rect>
  15.   </property>
  16.   <property name="minimumSize">
  17.    <size>
  18.     <width>1920</width>
  19.     <height>1080</height>
  20.    </size>
  21.   </property>
  22.   <property name="maximumSize">
  23.    <size>
  24.     <width>1920</width>
  25.     <height>1080</height>
  26.    </size>
  27.   </property>
  28.   <property name="windowTitle">
  29.    <string>Form</string>
  30.   </property>
  31.   <widget  name="race_prepare_page" native="true">
  32.    <property name="enabled">
  33.     <bool>true</bool>
  34.    </property>
  35.    <property name="geometry">
  36.     <rect>
  37.      <x>440</x>
  38.      <y>130</y>
  39.      <width>1211</width>
  40.      <height>721</height>
  41.     </rect>
  42.    </property>
  43.    <property name="styleSheet">
  44.     <string notr="true"/>
  45.    </property>
  46.    <widget  name="score_table_display">
  47.     <property name="enabled">
  48.      <bool>true</bool>
  49.     </property>
  50.     <property name="geometry">
  51.      <rect>
  52.       <x>580</x>
  53.       <y>190</y>
  54.       <width>621</width>
  55.       <height>341</height>
  56.      </rect>
  57.     </property>
  58.     <property name="styleSheet">
  59.      <string notr="true">font: 20px ;</string>
  60.     </property>
  61.    </widget>
  62.    <widget  name="score_display_label">
  63.     <property name="geometry">
  64.      <rect>
  65.       <x>830</x>
  66.       <y>540</y>
  67.       <width>131</width>
  68.       <height>41</height>
  69.      </rect>
  70.     </property>
  71.     <property name="styleSheet">
  72.      <string notr="true">font: 20px "Adobe Arabic";</string>
  73.     </property>
  74.     <property name="text">
  75.      <string>选手信息展示</string>
  76.     </property>
  77.    </widget>
  78.    <widget  name="race_info_button">
  79.     <property name="geometry">
  80.      <rect>
  81.       <x>200</x>
  82.       <y>660</y>
  83.       <width>121</width>
  84.       <height>51</height>
  85.      </rect>
  86.     </property>
  87.     <property name="styleSheet">
  88.      <string notr="true">font: 20px "Adobe Arabic";</string>
  89.     </property>
  90.     <property name="text">
  91.      <string>确认信息</string>
  92.     </property>
  93.    </widget>
  94.    <widget  name="race_start_button">
  95.     <property name="geometry">
  96.      <rect>
  97.       <x>740</x>
  98.       <y>90</y>
  99.       <width>121</width>
  100.       <height>51</height>
  101.      </rect>
  102.     </property>
  103.     <property name="styleSheet">
  104.      <string notr="true">font: 20px "Adobe Arabic";</string>
  105.     </property>
  106.     <property name="text">
  107.      <string>比赛开始</string>
  108.     </property>
  109.    </widget>
  110.    <widget  name="race_preparation_label">
  111.     <property name="geometry">
  112.      <rect>
  113.       <x>510</x>
  114.       <y>10</y>
  115.       <width>181</width>
  116.       <height>41</height>
  117.      </rect>
  118.     </property>
  119.     <property name="styleSheet">
  120.      <string notr="true">font: 30px "Adobe Arabic";</string>
  121.     </property>
  122.     <property name="text">
  123.      <string>比赛准备阶段</string>
  124.     </property>
  125.    </widget>
  126.    <widget  name="music_name_label">
  127.     <property name="enabled">
  128.      <bool>true</bool>
  129.     </property>
  130.     <property name="geometry">
  131.      <rect>
  132.       <x>10</x>
  133.       <y>350</y>
  134.       <width>91</width>
  135.       <height>81</height>
  136.      </rect>
  137.     </property>
  138.     <property name="styleSheet">
  139.      <string notr="true">font: 20px "Adobe Arabic";</string>
  140.     </property>
  141.     <property name="text">
  142.      <string>请按选手排序输入曲名名称</string>
  143.     </property>
  144.     <property name="wordWrap">
  145.      <bool>true</bool>
  146.     </property>
  147.    </widget>
  148.    <widget  name="remove_yes">
  149.     <property name="geometry">
  150.      <rect>
  151.       <x>250</x>
  152.       <y>560</y>
  153.       <width>61</width>
  154.       <height>21</height>
  155.      </rect>
  156.     </property>
  157.     <property name="styleSheet">
  158.      <string notr="true">font: 20px "Adobe Arabic";</string>
  159.     </property>
  160.     <property name="text">
  161.      <string>是</string>
  162.     </property>
  163.    </widget>
  164.    <widget  name="judge_number_input">
  165.     <property name="geometry">
  166.      <rect>
  167.       <x>100</x>
  168.       <y>110</y>
  169.       <width>151</width>
  170.       <height>31</height>
  171.      </rect>
  172.     </property>
  173.     <property name="styleSheet">
  174.      <string notr="true">font: 20px ;</string>
  175.     </property>
  176.     <property name="text">
  177.      <string/>
  178.     </property>
  179.     <property name="placeholderText">
  180.      <string>填写示例:1</string>
  181.     </property>
  182.    </widget>
  183.    <widget  name="race_name_label">
  184.     <property name="geometry">
  185.      <rect>
  186.       <x>10</x>
  187.       <y>60</y>
  188.       <width>91</width>
  189.       <height>24</height>
  190.      </rect>
  191.     </property>
  192.     <property name="styleSheet">
  193.      <string notr="true">font: 20px "Adobe Arabic";</string>
  194.     </property>
  195.     <property name="text">
  196.      <string>比赛名称</string>
  197.     </property>
  198.    </widget>
  199.    <widget  name="judge_namelist_input">
  200.     <property name="geometry">
  201.      <rect>
  202.       <x>100</x>
  203.       <y>160</y>
  204.       <width>151</width>
  205.       <height>171</height>
  206.      </rect>
  207.     </property>
  208.     <property name="styleSheet">
  209.      <string notr="true">font: 20px;</string>
  210.     </property>
  211.     <property name="markdown">
  212.      <string/>
  213.     </property>
  214.     <property name="html">
  215.      <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
  216. <html><head><meta name="qrichtext" content="1" /><style type="text/css">
  217. p, li { white-space: pre-wrap; }
  218. </style></head><body style=" font-family:'SimSun'; font-size:20px; font-weight:400; font-style:normal;">
  219. <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></string>
  220.     </property>
  221.     <property name="placeholderText">
  222.      <string>填写示例:   张三                 李四</string>
  223.     </property>
  224.    </widget>
  225.    <widget  name="judge_number_label">
  226.     <property name="geometry">
  227.      <rect>
  228.       <x>11</x>
  229.       <y>116</y>
  230.       <width>81</width>
  231.       <height>24</height>
  232.      </rect>
  233.     </property>
  234.     <property name="styleSheet">
  235.      <string notr="true">font: 20px "Adobe Arabic";</string>
  236.     </property>
  237.     <property name="text">
  238.      <string>评委数量</string>
  239.     </property>
  240.    </widget>
  241.    <widget  name="player_namelist_input">
  242.     <property name="geometry">
  243.      <rect>
  244.       <x>390</x>
  245.       <y>160</y>
  246.       <width>151</width>
  247.       <height>171</height>
  248.      </rect>
  249.     </property>
  250.     <property name="styleSheet">
  251.      <string notr="true">font: 20px;</string>
  252.     </property>
  253.     <property name="markdown">
  254.      <string/>
  255.     </property>
  256.     <property name="html">
  257.      <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
  258. <html><head><meta name="qrichtext" content="1" /><style type="text/css">
  259. p, li { white-space: pre-wrap; }
  260. </style></head><body style=" font-family:'SimSun'; font-size:20px; font-weight:400; font-style:normal;">
  261. <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></string>
  262.     </property>
  263.     <property name="placeholderText">
  264.      <string>填写示例:   张三               李四</string>
  265.     </property>
  266.    </widget>
  267.    <widget  name="player_name_label">
  268.     <property name="geometry">
  269.      <rect>
  270.       <x>300</x>
  271.       <y>160</y>
  272.       <width>91</width>
  273.       <height>81</height>
  274.      </rect>
  275.     </property>
  276.     <property name="styleSheet">
  277.      <string notr="true">font: 20px "Adobe Arabic";</string>
  278.     </property>
  279.     <property name="text">
  280.      <string>请按选手排序输入姓名</string>
  281.     </property>
  282.     <property name="wordWrap">
  283.      <bool>true</bool>
  284.     </property>
  285.    </widget>
  286.    <widget  name="race_name_input">
  287.     <property name="geometry">
  288.      <rect>
  289.       <x>100</x>
  290.       <y>54</y>
  291.       <width>441</width>
  292.       <height>31</height>
  293.      </rect>
  294.     </property>
  295.     <property name="accessibleName">
  296.      <string/>
  297.     </property>
  298.     <property name="styleSheet">
  299.      <string notr="true">font: 20px;</string>
  300.     </property>
  301.     <property name="inputMask">
  302.      <string/>
  303.     </property>
  304.     <property name="text">
  305.      <string/>
  306.     </property>
  307.     <property name="placeholderText">
  308.      <string>默认比赛</string>
  309.     </property>
  310.    </widget>
  311.    <widget  name="judge_name_label">
  312.     <property name="geometry">
  313.      <rect>
  314.       <x>10</x>
  315.       <y>160</y>
  316.       <width>91</width>
  317.       <height>81</height>
  318.      </rect>
  319.     </property>
  320.     <property name="styleSheet">
  321.      <string notr="true">font: 20px "Adobe Arabic";</string>
  322.     </property>
  323.     <property name="text">
  324.      <string>请按评委排序输入姓名</string>
  325.     </property>
  326.     <property name="wordWrap">
  327.      <bool>true</bool>
  328.     </property>
  329.    </widget>
  330.    <widget  name="player_number_input">
  331.     <property name="geometry">
  332.      <rect>
  333.       <x>390</x>
  334.       <y>110</y>
  335.       <width>151</width>
  336.       <height>31</height>
  337.      </rect>
  338.     </property>
  339.     <property name="styleSheet">
  340.      <string notr="true">font: 20px ;</string>
  341.     </property>
  342.     <property name="text">
  343.      <string/>
  344.     </property>
  345.     <property name="placeholderText">
  346.      <string>填写示例:1</string>
  347.     </property>
  348.    </widget>
  349.    <widget  name="remove_no">
  350.     <property name="geometry">
  351.      <rect>
  352.       <x>340</x>
  353.       <y>560</y>
  354.       <width>51</width>
  355.       <height>21</height>
  356.      </rect>
  357.     </property>
  358.     <property name="styleSheet">
  359.      <string notr="true">font: 20px "Adobe Arabic";</string>
  360.     </property>
  361.     <property name="text">
  362.      <string>否</string>
  363.     </property>
  364.    </widget>
  365.    <widget  name="remove_score_label">
  366.     <property name="geometry">
  367.      <rect>
  368.       <x>10</x>
  369.       <y>614</y>
  370.       <width>221</width>
  371.       <height>24</height>
  372.      </rect>
  373.     </property>
  374.     <property name="styleSheet">
  375.      <string notr="true">font: 20px "Adobe Arabic";</string>
  376.     </property>
  377.     <property name="text">
  378.      <string>去掉几个最高分和最低分</string>
  379.     </property>
  380.    </widget>
  381.    <widget  name="remove_score_input">
  382.     <property name="geometry">
  383.      <rect>
  384.       <x>250</x>
  385.       <y>610</y>
  386.       <width>151</width>
  387.       <height>31</height>
  388.      </rect>
  389.     </property>
  390.     <property name="styleSheet">
  391.      <string notr="true">font: 20px ;</string>
  392.     </property>
  393.     <property name="text">
  394.      <string/>
  395.     </property>
  396.     <property name="placeholderText">
  397.      <string>填写示例:1</string>
  398.     </property>
  399.    </widget>
  400.    <widget  name="player_number_label">
  401.     <property name="geometry">
  402.      <rect>
  403.       <x>300</x>
  404.       <y>116</y>
  405.       <width>91</width>
  406.       <height>24</height>
  407.      </rect>
  408.     </property>
  409.     <property name="styleSheet">
  410.      <string notr="true">font: 20px "Adobe Arabic";</string>
  411.     </property>
  412.     <property name="text">
  413.      <string>选手数量</string>
  414.     </property>
  415.    </widget>
  416.    <widget  name="remove_choose_label">
  417.     <property name="geometry">
  418.      <rect>
  419.       <x>10</x>
  420.       <y>560</y>
  421.       <width>221</width>
  422.       <height>24</height>
  423.      </rect>
  424.     </property>
  425.     <property name="styleSheet">
  426.      <string notr="true">font: 20px "Adobe Arabic";</string>
  427.     </property>
  428.     <property name="text">
  429.      <string>是否去掉最高分和最低分</string>
  430.     </property>
  431.    </widget>
  432.    <widget  name="music_namelist_input">
  433.     <property name="geometry">
  434.      <rect>
  435.       <x>100</x>
  436.       <y>350</y>
  437.       <width>441</width>
  438.       <height>181</height>
  439.      </rect>
  440.     </property>
  441.     <property name="styleSheet">
  442.      <string notr="true">font: 20px;</string>
  443.     </property>
  444.     <property name="markdown">
  445.      <string/>
  446.     </property>
  447.     <property name="html">
  448.      <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
  449. <html><head><meta name="qrichtext" content="1" /><style type="text/css">
  450. p, li { white-space: pre-wrap; }
  451. </style></head><body style=" font-family:'SimSun'; font-size:20px; font-weight:400; font-style:normal;">
  452. <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></string>
  453.     </property>
  454.     <property name="placeholderText">
  455.      <string>填写示例:                                  古典乐                                       爵士乐</string>
  456.     </property>
  457.    </widget>
  458.    <widget  name="continue_race_button">
  459.     <property name="geometry">
  460.      <rect>
  461.       <x>890</x>
  462.       <y>90</y>
  463.       <width>151</width>
  464.       <height>51</height>
  465.      </rect>
  466.     </property>
  467.     <property name="styleSheet">
  468.      <string notr="true">font: 20px "Adobe Arabic";</string>
  469.     </property>
  470.     <property name="text">
  471.      <string>继续上次比赛</string>
  472.     </property>
  473.    </widget>
  474.    <widget  name="quit_code_button">
  475.     <property name="geometry">
  476.      <rect>
  477.       <x>1070</x>
  478.       <y>90</y>
  479.       <width>121</width>
  480.       <height>51</height>
  481.      </rect>
  482.     </property>
  483.     <property name="styleSheet">
  484.      <string notr="true">font: 20px "Adobe Arabic";</string>
  485.     </property>
  486.     <property name="text">
  487.      <string>退出程序</string>
  488.     </property>
  489.    </widget>
  490.    <widget  name="save_info_button">
  491.     <property name="geometry">
  492.      <rect>
  493.       <x>590</x>
  494.       <y>90</y>
  495.       <width>121</width>
  496.       <height>51</height>
  497.      </rect>
  498.     </property>
  499.     <property name="styleSheet">
  500.      <string notr="true">font: 20px "Adobe Arabic";</string>
  501.     </property>
  502.     <property name="text">
  503.      <string>保存信息</string>
  504.     </property>
  505.    </widget>
  506.   </widget>
  507.   <widget  name="race_going_page" native="true">
  508.    <property name="geometry">
  509.     <rect>
  510.      <x>440</x>
  511.      <y>130</y>
  512.      <width>1211</width>
  513.      <height>721</height>
  514.     </rect>
  515.    </property>
  516.    <widget  name="race_going_label">
  517.     <property name="geometry">
  518.      <rect>
  519.       <x>0</x>
  520.       <y>10</y>
  521.       <width>1211</width>
  522.       <height>41</height>
  523.      </rect>
  524.     </property>
  525.     <property name="styleSheet">
  526.      <string notr="true">font: 30px "Adobe Arabic";</string>
  527.     </property>
  528.     <property name="text">
  529.      <string>比赛进行阶段</string>
  530.     </property>
  531.     <property name="alignment">
  532.      <set>Qt::AlignCenter</set>
  533.     </property>
  534.    </widget>
  535.    <widget  name="judge_one_label_1">
  536.     <property name="geometry">
  537.      <rect>
  538.       <x>80</x>
  539.       <y>146</y>
  540.       <width>181</width>
  541.       <height>41</height>
  542.      </rect>
  543.     </property>
  544.     <property name="styleSheet">
  545.      <string notr="true">font: 20px;</string>
  546.     </property>
  547.     <property name="text">
  548.      <string>姓名:1号评委</string>
  549.     </property>
  550.    </widget>
  551.    <widget  name="judgeone_score_input_1">
  552.     <property name="geometry">
  553.      <rect>
  554.       <x>300</x>
  555.       <y>150</y>
  556.       <width>151</width>
  557.       <height>31</height>
  558.      </rect>
  559.     </property>
  560.     <property name="styleSheet">
  561.      <string notr="true">font: 20px ;</string>
  562.     </property>
  563.     <property name="text">
  564.      <string/>
  565.     </property>
  566.     <property name="placeholderText">
  567.      <string>填写示例:1</string>
  568.     </property>
  569.    </widget>
  570.    <widget  name="judge_one_label_2">
  571.     <property name="geometry">
  572.      <rect>
  573.       <x>81</x>
  574.       <y>202</y>
  575.       <width>181</width>
  576.       <height>41</height>
  577.      </rect>
  578.     </property>
  579.     <property name="styleSheet">
  580.      <string notr="true">font: 20px;</string>
  581.     </property>
  582.     <property name="text">
  583.      <string>姓名:2号评委</string>
  584.     </property>
  585.    </widget>
  586.    <widget  name="judgeone_score_input_2">
  587.     <property name="geometry">
  588.      <rect>
  589.       <x>301</x>
  590.       <y>206</y>
  591.       <width>151</width>
  592.       <height>31</height>
  593.      </rect>
  594.     </property>
  595.     <property name="styleSheet">
  596.      <string notr="true">font: 20px ;</string>
  597.     </property>
  598.     <property name="text">
  599.      <string/>
  600.     </property>
  601.     <property name="placeholderText">
  602.      <string>填写示例:1</string>
  603.     </property>
  604.    </widget>
  605.    <widget  name="judge_one_label_3">
  606.     <property name="geometry">
  607.      <rect>
  608.       <x>81</x>
  609.       <y>252</y>
  610.       <width>181</width>
  611.       <height>41</height>
  612.      </rect>
  613.     </property>
  614.     <property name="styleSheet">
  615.      <string notr="true">font: 20px;</string>
  616.     </property>
  617.     <property name="text">
  618.      <string>姓名:3号评委</string>
  619.     </property>
  620.    </widget>
  621.    <widget  name="judgeone_score_input_3">
  622.     <property name="geometry">
  623.      <rect>
  624.       <x>301</x>
  625.       <y>256</y>
  626.       <width>151</width>
  627.       <height>31</height>
  628.      </rect>
  629.     </property>
  630.     <property name="styleSheet">
  631.      <string notr="true">font: 20px ;</string>
  632.     </property>
  633.     <property name="text">
  634.      <string/>
  635.     </property>
  636.     <property name="placeholderText">
  637.      <string>填写示例:1</string>
  638.     </property>
  639.    </widget>
  640.    <widget  name="judgeone_score_input_4">
  641.     <property name="geometry">
  642.      <rect>
  643.       <x>300</x>
  644.       <y>310</y>
  645.       <width>151</width>
  646.       <height>31</height>
  647.      </rect>
  648.     </property>
  649.     <property name="styleSheet">
  650.      <string notr="true">font: 20px ;</string>
  651.     </property>
  652.     <property name="text">
  653.      <string/>
  654.     </property>
  655.     <property name="placeholderText">
  656.      <string>填写示例:1</string>
  657.     </property>
  658.    </widget>
  659.    <widget  name="judge_one_label_4">
  660.     <property name="geometry">
  661.      <rect>
  662.       <x>80</x>
  663.       <y>306</y>
  664.       <width>181</width>
  665.       <height>41</height>
  666.      </rect>
  667.     </property>
  668.     <property name="styleSheet">
  669.      <string notr="true">font: 20px;</string>
  670.     </property>
  671.     <property name="text">
  672.      <string>姓名:4号评委</string>
  673.     </property>
  674.    </widget>
  675.    <widget  name="judge_one_label_5">
  676.     <property name="geometry">
  677.      <rect>
  678.       <x>81</x>
  679.       <y>362</y>
  680.       <width>181</width>
  681.       <height>41</height>
  682.      </rect>
  683.     </property>
  684.     <property name="styleSheet">
  685.      <string notr="true">font: 20px;</string>
  686.     </property>
  687.     <property name="text">
  688.      <string>姓名:5号评委</string>
  689.     </property>
  690.    </widget>
  691.    <widget  name="judgeone_score_input_5">
  692.     <property name="geometry">
  693.      <rect>
  694.       <x>301</x>
  695.       <y>366</y>
  696.       <width>151</width>
  697.       <height>31</height>
  698.      </rect>
  699.     </property>
  700.     <property name="styleSheet">
  701.      <string notr="true">font: 20px ;</string>
  702.     </property>
  703.     <property name="text">
  704.      <string/>
  705.     </property>
  706.     <property name="placeholderText">
  707.      <string>填写示例:1</string>
  708.     </property>
  709.    </widget>
  710.    <widget  name="judge_one_label_6">
  711.     <property name="geometry">
  712.      <rect>
  713.       <x>81</x>
  714.       <y>422</y>
  715.       <width>181</width>
  716.       <height>41</height>
  717.      </rect>
  718.     </property>
  719.     <property name="styleSheet">
  720.      <string notr="true">font: 20px;</string>
  721.     </property>
  722.     <property name="text">
  723.      <string>姓名:6号评委</string>
  724.     </property>
  725.    </widget>
  726.    <widget  name="judgeone_score_input_6">
  727.     <property name="geometry">
  728.      <rect>
  729.       <x>301</x>
  730.       <y>426</y>
  731.       <width>151</width>
  732.       <height>31</height>
  733.      </rect>
  734.     </property>
  735.     <property name="styleSheet">
  736.      <string notr="true">font: 20px ;</string>
  737.     </property>
  738.     <property name="text">
  739.      <string/>
  740.     </property>
  741.     <property name="placeholderText">
  742.      <string>填写示例:1</string>
  743.     </property>
  744.    </widget>
  745.    <widget  name="judge_one_label_7">
  746.     <property name="geometry">
  747.      <rect>
  748.       <x>81</x>
  749.       <y>482</y>
  750.       <width>181</width>
  751.       <height>41</height>
  752.      </rect>
  753.     </property>
  754.     <property name="styleSheet">
  755.      <string notr="true">font: 20px;</string>
  756.     </property>
  757.     <property name="text">
  758.      <string>姓名:7号评委</string>
  759.     </property>
  760.    </widget>
  761.    <widget  name="judgeone_score_input_7">
  762.     <property name="geometry">
  763.      <rect>
  764.       <x>301</x>
  765.       <y>486</y>
  766.       <width>151</width>
  767.       <height>31</height>
  768.      </rect>
  769.     </property>
  770.     <property name="styleSheet">
  771.      <string notr="true">font: 20px ;</string>
  772.     </property>
  773.     <property name="text">
  774.      <string/>
  775.     </property>
  776.     <property name="placeholderText">
  777.      <string>填写示例:1</string>
  778.     </property>
  779.    </widget>
  780.    <widget  name="judge_one_label_8">
  781.     <property name="geometry">
  782.      <rect>
  783.       <x>81</x>
  784.       <y>542</y>
  785.       <width>181</width>
  786.       <height>41</height>
  787.      </rect>
  788.     </property>
  789.     <property name="styleSheet">
  790.      <string notr="true">font: 20px;</string>
  791.     </property>
  792.     <property name="text">
  793.      <string>姓名:8号评委</string>
  794.     </property>
  795.    </widget>
  796.    <widget  name="judgeone_score_input_8">
  797.     <property name="geometry">
  798.      <rect>
  799.       <x>301</x>
  800.       <y>546</y>
  801.       <width>151</width>
  802.       <height>31</height>
  803.      </rect>
  804.     </property>
  805.     <property name="styleSheet">
  806.      <string notr="true">font: 20px ;</string>
  807.     </property>
  808.     <property name="text">
  809.      <string/>
  810.     </property>
  811.     <property name="placeholderText">
  812.      <string>填写示例:1</string>
  813.     </property>
  814.    </widget>
  815.    <widget  name="judge_one_label_9">
  816.     <property name="geometry">
  817.      <rect>
  818.       <x>81</x>
  819.       <y>602</y>
  820.       <width>181</width>
  821.       <height>41</height>
  822.      </rect>
  823.     </property>
  824.     <property name="styleSheet">
  825.      <string notr="true">font: 20px;</string>
  826.     </property>
  827.     <property name="text">
  828.      <string>姓名:9号评委</string>
  829.     </property>
  830.    </widget>
  831.    <widget  name="judgeone_score_input_9">
  832.     <property name="geometry">
  833.      <rect>
  834.       <x>301</x>
  835.       <y>606</y>
  836.       <width>151</width>
  837.       <height>31</height>
  838.      </rect>
  839.     </property>
  840.     <property name="styleSheet">
  841.      <string notr="true">font: 20px ;</string>
  842.     </property>
  843.     <property name="text">
  844.      <string/>
  845.     </property>
  846.     <property name="placeholderText">
  847.      <string>填写示例:1</string>
  848.     </property>
  849.    </widget>
  850.    <widget  name="judge_com_label_1">
  851.     <property name="geometry">
  852.      <rect>
  853.       <x>510</x>
  854.       <y>250</y>
  855.       <width>151</width>
  856.       <height>41</height>
  857.      </rect>
  858.     </property>
  859.     <property name="styleSheet">
  860.      <string notr="true">font: 24px;</string>
  861.     </property>
  862.     <property name="text">
  863.      <string>最高分:</string>
  864.     </property>
  865.    </widget>
  866.    <widget  name="judge_com_label_2">
  867.     <property name="geometry">
  868.      <rect>
  869.       <x>700</x>
  870.       <y>250</y>
  871.       <width>161</width>
  872.       <height>41</height>
  873.      </rect>
  874.     </property>
  875.     <property name="styleSheet">
  876.      <string notr="true">font: 24px;</string>
  877.     </property>
  878.     <property name="text">
  879.      <string>最低分:</string>
  880.     </property>
  881.    </widget>
  882.    <widget  name="judge_com_label_3">
  883.     <property name="geometry">
  884.      <rect>
  885.       <x>510</x>
  886.       <y>320</y>
  887.       <width>151</width>
  888.       <height>41</height>
  889.      </rect>
  890.     </property>
  891.     <property name="styleSheet">
  892.      <string notr="true">font: 30px;</string>
  893.     </property>
  894.     <property name="text">
  895.      <string>实际得分:</string>
  896.     </property>
  897.    </widget>
  898.    <widget  name="judge_com_label_4">
  899.     <property name="geometry">
  900.      <rect>
  901.       <x>670</x>
  902.       <y>300</y>
  903.       <width>181</width>
  904.       <height>81</height>
  905.      </rect>
  906.     </property>
  907.     <property name="styleSheet">
  908.      <string notr="true">font: 60px;</string>
  909.     </property>
  910.     <property name="text">
  911.      <string/>
  912.     </property>
  913.    </widget>
  914.    <widget  name="next_player_button">
  915.     <property name="geometry">
  916.      <rect>
  917.       <x>630</x>
  918.       <y>170</y>
  919.       <width>151</width>
  920.       <height>51</height>
  921.      </rect>
  922.     </property>
  923.     <property name="styleSheet">
  924.      <string notr="true">font: 20px "Adobe Arabic";</string>
  925.     </property>
  926.     <property name="text">
  927.      <string>下一个选手</string>
  928.     </property>
  929.    </widget>
  930.    <widget  name="exit_race_button">
  931.     <property name="geometry">
  932.      <rect>
  933.       <x>970</x>
  934.       <y>170</y>
  935.       <width>151</width>
  936.       <height>51</height>
  937.      </rect>
  938.     </property>
  939.     <property name="styleSheet">
  940.      <string notr="true">font: 20px "Adobe Arabic";</string>
  941.     </property>
  942.     <property name="text">
  943.      <string>比赛结束</string>
  944.     </property>
  945.    </widget>
  946.    <widget  name="current_player_label">
  947.     <property name="geometry">
  948.      <rect>
  949.       <x>80</x>
  950.       <y>90</y>
  951.       <width>1091</width>
  952.       <height>41</height>
  953.      </rect>
  954.     </property>
  955.     <property name="styleSheet">
  956.      <string notr="true">font: 24px;</string>
  957.     </property>
  958.     <property name="text">
  959.      <string>当前选手:</string>
  960.     </property>
  961.    </widget>
  962.    <widget  name="player_quit_button">
  963.     <property name="geometry">
  964.      <rect>
  965.       <x>800</x>
  966.       <y>170</y>
  967.       <width>151</width>
  968.       <height>51</height>
  969.      </rect>
  970.     </property>
  971.     <property name="styleSheet">
  972.      <string notr="true">font: 20px "Adobe Arabic";</string>
  973.     </property>
  974.     <property name="text">
  975.      <string>当前选手弃权</string>
  976.     </property>
  977.    </widget>
  978.   </widget>
  979. </widget>
  980. <resources/>
  981. <connections/>
  982. </ui>
复制代码
代码设计

程序主要功能包含,文件上传,文件读取,分数计算,然后还有一些按钮绑定事件。
  1. from PyQt5.QtGui import *
  2. from PyQt5.QtWidgets import *
  3. from PyQt5.QtCore import *
  4. from PyQt5 import uic
  5. import keyboard
  6. import sys
  7. import os
  8. import pandas as pd
  9. import docx
  10. def get_path(relative_path):
  11.     try:
  12.         base_path = sys._MEIPASS
  13.     except AttributeError:
  14.         base_path = os.path.abspath(".")
  15.     return os.path.normpath(os.path.join(base_path, relative_path))
  16. def get_decimal_places(num):
  17.     import decimal
  18.     if '.' in str(num):
  19.         num = str(float(num))   #如果传入的是字符串形式的浮点数,先去掉小数后面无意义的0
  20.     d = decimal.Decimal(str(num))
  21.     return abs(d.as_tuple().exponent)
  22. def del_files(path_file):
  23.     ls = os.listdir(path_file)
  24.     for i in ls:
  25.         f_path = os.path.join(path_file, i)
  26.         # 判断是否是一个目录,若是,则递归删除
  27.         if os.path.isdir(f_path):
  28.             del_files(f_path)
  29.         else:
  30.             os.remove(f_path)
  31. class MyWindow(QWidget):
  32.     def __init__(self):
  33.         super().__init__()
  34.         self.ui = uic.loadUi(get_path("assets/comscore_final.ui")) #读取ui文件
  35.         # 展示窗口
  36.         self.ui.setWindowTitle('比赛计分系统')
  37.         self.ui.setWindowFlag(Qt.WindowCloseButtonHint, False)
  38.         
  39.         #提取每个要使用的控件
  40.         #比赛准备阶段  
  41.         self.race_prepare=self.ui.race_prepare_page #比赛准备页面
  42.         self.race_name=self.ui.race_name_input #比赛名称
  43.         self.judge_number=self.ui.judge_number_input #评委数量
  44.         self.judge_namelist=self.ui.judge_namelist_input #评委信息
  45.         self.player_number=self.ui.player_number_input #选手数量
  46.         self.player_namelist=self.ui.player_namelist_input #选手信息
  47.         self.music_namelist=self.ui.music_namelist_input #音乐信息
  48.         self.race_info=self.ui.race_info_button #确认信息按钮
  49.         self.continue_race=self.ui.continue_race_button #继续上次比赛按钮
  50.         self.race_start=self.ui.race_start_button #比赛开始按钮'
  51.         self.remove_score=self.ui.remove_score_input
  52.         self.save_info=self.ui.save_info_button #保存信息
  53.         self.quit_code=self.ui.quit_code_button #退出程序
  54.         self.race_start.setEnabled(False)
  55.         self.save_info.setEnabled(False)
  56.         #是否去掉最高分和最低分
  57.         self.remove_yes_radiobox=self.ui.remove_yes
  58.         self.remove_no_radiobox=self.ui.remove_no
  59.         #去掉最高分和最低分的数量
  60.         self.remove_score_label_now=self.ui.remove_score_label
  61.         self.remove_score=self.ui.remove_score_input
  62.         #默认选择不去掉,并且设置不显示去掉几个最高分和最低分的框
  63.         self.remove_no_radiobox.setChecked(True)
  64.         self.remove_score.setVisible(False) #初始设置隐藏
  65.         self.remove_score_label_now.setVisible(False) #初始设置隐藏
  66.         #toggled信号与槽函数绑定
  67.         self.remove_yes_radiobox.toggled.connect(lambda :self.func_radiobox_btnstate(self.remove_yes_radiobox))
  68.         self.remove_no_radiobox.toggled.connect(lambda :self.func_radiobox_btnstate(self.remove_no_radiobox))
  69.         #选手信息展示
  70.         self.score_table=self.ui.score_table_display #选手信息展示
  71.         # 绑定信号与槽函数
  72.         self.race_info.clicked.connect(self.func_race_info) #信息导入
  73.         self.continue_race.clicked.connect(self.func_continue_race)# 根据文件来读取信息
  74.         self.race_start.clicked.connect(self.func_race_start) #比赛开始按钮
  75.         self.save_info.clicked.connect(self.func_save_info) #保存信息
  76.         self.quit_code.clicked.connect(self.func_quit_code)
  77.         #选手信息展示区域函数
  78.         self.score_table.setSelectionMode(QAbstractItemView.SingleSelection)#设置选取方式为单个选取
  79.         self.score_table.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn) #设置水平滚动
  80.         self.score_table.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)  #设置竖直滚动
  81.         #---------------------------------------------------------------------------------------------------------------------
  82.         #---------------------------------------------------------------------------------------------------------------------
  83.         #比赛进行阶段
  84.         self.race_going=self.ui.race_going_page #比赛进行页面
  85.         self.race_going.setVisible(False) #初始设置隐藏
  86.         self.race_going_name=self.ui.race_going_label
  87.         #当前选手
  88.         self.current_player=self.ui.current_player_label
  89.         #评委列表
  90.         self.judge_one_1=self.ui.judge_one_label_1
  91.         self.judgeone_score_1=self.ui.judgeone_score_input_1
  92.         #设置校验规则,实例化浮点校验器,并设置范围0~10,精度为小数点两位
  93.         myValidator = QRegExpValidator(QRegExp("^(10|\d(\.\d{1,2})?)$"))
  94.         #初始设置隐藏
  95.         for show_i in range(1,10):
  96.             judge_one_label_name="judge_one_label_"+str(show_i)
  97.             judge_one_temp = self.race_going.findChild(QLabel,judge_one_label_name)
  98.             judge_one_temp.setVisible(False)
  99.             judgeone_score_input_name="judgeone_score_input_"+str(show_i)
  100.             judgeone_score_temp = self.race_going.findChild(QLineEdit,judgeone_score_input_name)
  101.             judgeone_score_temp.setVisible(False)
  102.             #设置校验规则,限制只能输入数字还有小数后两位
  103.             judgeone_score_temp.returnPressed.connect(self.func_text_change)
  104.             judgeone_score_temp.setValidator(myValidator)
  105.         
  106.         #最高分,最低分,实际得分
  107.         self.judge_com_max=self.ui.judge_com_label_1  #最高分
  108.         self.judge_com_min=self.ui.judge_com_label_2  #最低分
  109.         self.judge_com_average_label=self.ui.judge_com_label_3  #实际得分标签
  110.         self.judge_com_average=self.ui.judge_com_label_4 #分数
  111.         for show_i in range(1,5):
  112.             judge_com_label_name="judge_com_label_"+str(show_i)
  113.             judge_com_temp = self.race_going.findChild(QLabel,judge_com_label_name)
  114.             judge_com_temp.setVisible(False)
  115.         #计算总分按钮
  116.         # self.com_score=self.ui.com_score_button
  117.         #下一个选手按钮
  118.         self.next_player=self.ui.next_player_button
  119.         #比赛结束按钮
  120.         self.exit_race=self.ui.exit_race_button
  121.         #选手弃权按钮
  122.         self.player_quit=self.ui.player_quit_button
  123.         # 绑定信号与槽函数
  124.         # self.com_score.clicked.connect(self.func_com_score) #计算总分
  125.         self.next_player.clicked.connect(self.func_next_player) #下一个选手
  126.         self.exit_race.clicked.connect(self.func_exit_race) #结束比赛
  127.         self.player_quit.clicked.connect(self.func_player_quit) #选手弃权
  128.         
  129.         #赋予一个全局使用的数据变量
  130.         self.all_data_df=[]
  131.         self.have_score_number=0 #表示当前已经计分的选手数量
  132.         self.remove_score_number=0
  133.     def func_save_info(self):
  134.         reply_one=self.setQMessageBoxtwoButtonTextENToCN('提示', '是否保存信息?',QMessageBox.Question)
  135.         if reply_one == QMessageBox.Yes:
  136.             #先将读取的数据保存起来,以tablewight数据表信息为准
  137.             player_index=[]
  138.             player_name=[]
  139.             music_name=[]
  140.             for qtable_row in range(int(self.player_number.text())):
  141.                 player_index.append(self.score_table.item(qtable_row,0).text())  #获取某行某列item中的x信息
  142.                 player_name.append(self.score_table.item(qtable_row,1).text())  #获取某行某列item中的x信息
  143.                 music_name.append(self.score_table.item(qtable_row,2).text())  #获取某行某列item中的x信息
  144.             
  145.             judge_all_list=[]
  146.             for qtable_column in range(int(self.judge_number.text())):
  147.                 judge_one_list=[' ']*int(self.player_number.text()) #将列数据全部填充为空格
  148.                 judge_all_list.append(judge_one_list)
  149.             # creating the DataFrame
  150.             all_data = pd.DataFrame(list(zip(player_index, player_name, music_name)))
  151.             all_data.columns =['抽签序号', '选手姓名', '曲目名称'] #设置列名
  152.             judge_namelist_temp=self.judge_namelist.toPlainText().split('\n')
  153.             for qtable_column in range(int(self.judge_number.text())):
  154.                 judge_one_list=[' ']*int(self.player_number.text()) #将列数据全部填充为空格
  155.                 judge_column_name=judge_namelist_temp[qtable_column]+":"+str(qtable_column+1)+"号评委"
  156.                 all_data[judge_column_name]=judge_one_list
  157.             #增加最高分,最低分列 ,增加实际得分列
  158.             if self.remove_yes_radiobox.isChecked()==True:
  159.                 max_one_list=[' ']*int(self.player_number.text()) #将列数据全部填充为空格
  160.                 all_data['最高分']=max_one_list
  161.                 min_one_list=[' ']*int(self.player_number.text()) #将列数据全部填充为空格
  162.                 all_data['最低分']=min_one_list
  163.                 visual_one_list=[-1]*int(self.player_number.text()) #将列数据全部填充为空格
  164.                 all_data['实得分']=visual_one_list
  165.                 index_one_list=[' ']*int(self.player_number.text()) #将列数据全部填充为空格
  166.                 all_data['最终排名']=index_one_list
  167.                 remove_score_str=self.remove_score.text()
  168.                 self.remove_score_number=int(self.remove_score.text())
  169.                 remove_one_list=[remove_score_str]*int(self.player_number.text()) #将列数据全部填充为空格
  170.                 all_data['去掉几个最高分']=remove_one_list
  171.             else:
  172.                 visual_one_list=[-1]*int(self.player_number.text()) #将列数据全部填充为空格
  173.                 all_data['实得分']=visual_one_list
  174.                 index_one_list=[' ']*int(self.player_number.text()) #将列数据全部填充为空格
  175.                 all_data['最终排名']=index_one_list
  176.                 remove_one_list=['0']*int(self.player_number.text()) #将列数据全部填充为空格
  177.                 all_data['去掉几个最高分']=remove_one_list
  178.             all_data['抽签序号']=all_data['抽签序号'].astype(int)
  179.             all_data=all_data.sort_values(by=['抽签序号']) #按照抽签序号排序
  180.             all_data=all_data.reset_index(drop=True) #重新排列一下索引
  181.             all_data.to_excel('temp_data/'+str(self.race_name.text())+'_临时存储数据.xlsx', sheet_name='部分信息', index=True) # index false为不写入索引
  182.             
  183.             #恢复所有数据初始状态
  184.             self.all_data_df=[]
  185.             self.have_score_number=0 #表示当前已经计分的选手数量
  186.             self.remove_score_number=0
  187.             #默认选择不去掉,并且设置不显示去掉几个最高分和最低分的框
  188.             self.remove_no_radiobox.setChecked(True)
  189.             self.remove_score.setVisible(False) #初始设置隐藏
  190.             self.remove_score_label_now.setVisible(False) #初始设置隐藏
  191.             #然后要清空所有的输入
  192.             self.race_name.setText("") #比赛名称
  193.             self.judge_number.setText("") #评委数量
  194.             self.judge_namelist.setText("") #评委信息
  195.             self.player_number.setText("") #选手数量
  196.             self.player_namelist.setText("") #选手信息
  197.             self.music_namelist.setText("") #音乐信息
  198.             #然后清空qtablewight
  199.             self.score_table.setRowCount(0)
  200.             self.score_table.setColumnCount(0)
  201.             self.score_table.clearContents()
  202.             #设置按钮不可用
  203.             self.race_start.setEnabled(False)
  204.             self.save_info.setEnabled(False)
  205.             self.setQMessageBoxoneButtonTextENToCN("提示","保存信息成功",QMessageBox.Information)
  206.             return
  207.         else:
  208.             self.setQMessageBoxoneButtonTextENToCN("提示","用户取消操作",QMessageBox.Information)
  209.             return
  210.         return
  211.         return
  212.     def func_quit_code(self):
  213.         reply_one=self.setQMessageBoxtwoButtonTextENToCN('提示', '是否退出程序?',QMessageBox.Question)
  214.         if reply_one == QMessageBox.Yes:
  215.             self.setQMessageBoxoneButtonTextENToCN("提示","退出程序成功",QMessageBox.Information)
  216.             sys.exit(0)
  217.             return
  218.         else:
  219.             self.setQMessageBoxoneButtonTextENToCN("提示","用户取消操作",QMessageBox.Information)
  220.             return
  221.         return
  222.     def func_text_change(self):
  223.         #在输入框内按下enter,就会进入这里
  224.         #获取数据,保存这个选手的得分到临时表格中
  225.         all_data_temp=self.all_data_df
  226.         judge_number=0
  227.         if int(all_data_temp.loc[0,'去掉几个最高分'])>0:
  228.             judge_number=int(all_data_temp.shape[1])-8
  229.         else:
  230.             judge_number=int(all_data_temp.shape[1])-6
  231.         #遍历所有输入框,然后找到第一个为空的输入框,设置它为setFocus即可
  232.         for com_i in range(1,judge_number+1):
  233.             judgeone_score_input_name="judgeone_score_input_"+str(com_i)
  234.             judgeone_score_temp = self.race_going.findChild(QLineEdit,judgeone_score_input_name)
  235.             if judgeone_score_temp.text()=='':
  236.                 judgeone_score_temp.setFocus()
  237.                 return
  238.             else:
  239.                 continue
  240.         #获取数据,保存这个选手的得分到临时表格中
  241.         all_data_temp=self.all_data_df
  242.         print(self.all_data_df)
  243.         reply_zero=self.setQMessageBoxtwoButtonTextENToCN('提示', '评委得分是否输入正确?',QMessageBox.Question)
  244.         if reply_zero == QMessageBox.Yes:
  245.             #根据评委数量来获取输入框数据
  246.             score_list_temp=[]
  247.             save_score_list=[]
  248.             judge_number=0
  249.             if int(all_data_temp.loc[0,'去掉几个最高分'])>0:
  250.                 judge_number=int(all_data_temp.shape[1])-8
  251.             else:
  252.                 judge_number=int(all_data_temp.shape[1])-6
  253.             print(judge_number)
  254.             for com_i in range(1,judge_number+1):
  255.                 judgeone_score_input_name="judgeone_score_input_"+str(com_i)
  256.                 judgeone_score_temp = self.race_going.findChild(QLineEdit,judgeone_score_input_name)
  257.                 judgeone_score_temp.setReadOnly(True)  #设置为只读
  258.                
  259.                 if judgeone_score_temp.text()=='':
  260.                     self.setQMessageBoxoneButtonTextENToCN("提示",str(com_i)+"评委分数未填写",QMessageBox.Information)
  261.                     return
  262.                 else:
  263.                     score_list_temp.append(float(judgeone_score_temp.text()))
  264.                     save_score_list.append(float(judgeone_score_temp.text()))
  265.             
  266.             print(score_list_temp)
  267.             score_list_temp.sort() #对打分进行排序
  268.             
  269.             #设置最高分
  270.             score_list_temp_max=max(score_list_temp)
  271.             self.judge_com_max.setText("最高分: "+str(score_list_temp_max))
  272.             # self.score_table.setText(score_list_temp_max)
  273.             #设置最低分
  274.             score_list_temp_min=min(score_list_temp)
  275.             self.judge_com_min.setText("最低分: "+str(score_list_temp_min))
  276.             for flag in range(self.remove_score_number):
  277.                 score_list_temp.pop() #删除最后一项
  278.                 score_list_temp.pop(0) #删除第一项
  279.             #设置最终分数
  280.             average_score=round(sum(score_list_temp)/len(score_list_temp),3)
  281.             #设置
  282.             self.judge_com_average.setText(str(average_score))
  283.             #确定当前计算的是哪个选手,至少有一个评委
  284.             current_player_row=0
  285.             player_row=int(all_data_temp.shape[0])
  286.             for player_row_index in range(0,player_row):
  287.                 print(str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3]))
  288.                 print(str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3])=='-1')
  289.                 if str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3])=='-1' or str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3])=='-1.0':
  290.                     current_player_row=player_row_index
  291.                     break
  292.                 current_player_row=player_row_index
  293.             
  294.             self.have_score_number=current_player_row
  295.             #保存方法在有最高分和没有最高分时有所不同,有
  296.             if int(all_data_temp.loc[0,'去掉几个最高分'])>0:
  297.             #将这里面的数据进行覆盖  操作的是save_score_list,score_list_temp_max,score_list_temp_min
  298.                 print(save_score_list)
  299.                 for judge_number_index in range(0,judge_number):
  300.                     print(judge_number_index)
  301.                     all_data_temp.iloc[current_player_row,judge_number_index+3]=save_score_list[judge_number_index]   
  302.                
  303.                 all_data_temp.iloc[current_player_row,judge_number_index+4]=score_list_temp_max
  304.                 all_data_temp.iloc[current_player_row,judge_number_index+5]=score_list_temp_min
  305.                 all_data_temp.iloc[current_player_row,judge_number_index+6]=average_score
  306.             else:
  307.                 for judge_number_index in range(0,judge_number):
  308.                     all_data_temp.iloc[current_player_row,judge_number_index+3]=save_score_list[judge_number_index]   
  309.                
  310.                 all_data_temp.iloc[current_player_row,judge_number_index+4]=average_score
  311.             #重新保存数据表,最后再赋值回去
  312.             all_data_temp.to_excel('temp_data/'+str(self.race_name.text())+'_临时存储数据.xlsx', sheet_name='部分信息', index=True) # index false为不写入索引
  313.             self.all_data_df=all_data_temp
  314.             print(self.all_data_df)
  315.             # #清空分数框         
  316.             # for show_i in range(1,judge_number+1):
  317.             #     judgeone_score_input_name="judgeone_score_input_"+str(show_i)
  318.             #     judgeone_score_temp = self.race_going.findChild(QLineEdit,judgeone_score_input_name)
  319.             #     judgeone_score_temp.clear()
  320.             
  321.             self.have_score_number=self.have_score_number+1 #保存当前选手序号,只用于验证选手是否弃权
  322.             print("self.have_score_number=",self.have_score_number)
  323.             return
  324.         else:
  325.             self.setQMessageBoxoneButtonTextENToCN("提示","请检查后,继续填写",QMessageBox.Information)
  326.             return
  327.         return
  328.     #单选按钮绑定
  329.     def func_radiobox_btnstate(self,btn):
  330.         #输出按钮1与按钮2的状态,选中还是没选中
  331.         if btn.text()=='是':
  332.             if btn.isChecked()==True:
  333.                 # print(btn.text()+"is selected")
  334.                 self.remove_score.setVisible(True) #初始设置隐藏
  335.                 self.remove_score_label_now.setVisible(True) #初始设置隐藏
  336.             else:
  337.                 # print(btn.text()+"is deselected")
  338.                 return
  339.         if btn.text()=="否":
  340.             if btn.isChecked() == True:
  341.                 # print(btn.text() + "is selected")
  342.                 self.remove_score.setVisible(False) #初始设置隐藏
  343.                 self.remove_score_label_now.setVisible(False) #初始设置隐藏
  344.                 self.remove_score.setText("") #重新设置为空
  345.             else:
  346.                 # print(btn.text() + "is deselected")
  347.                 return
  348.     def setQMessageBoxtwoButtonTextENToCN(self,windowTitle, text,  qmessageIcon):
  349.         """
  350.         设置需要的QMessageBox的按钮提示为中文
  351.         :param qmessageIcon: 显示图标  例如QMessageBox.Question
  352.         :param kwargs: 确定=QMessageBox.AcceptRole
  353.         """
  354.         msgBox = QMessageBox()
  355.         msgBox.setWindowTitle(windowTitle)
  356.         msgBox.setText(text)
  357.         msgBox.setIcon(qmessageIcon)
  358.         msgBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
  359.         buttonY = msgBox.button(QMessageBox.Yes)
  360.         buttonY.setText('是')
  361.         buttonN = msgBox.button(QMessageBox.No)
  362.         buttonN.setText('否')
  363.         ret=msgBox.exec_()
  364.         return ret
  365.    
  366.     def setQMessageappENToCN(self,windowTitle, text,  qmessageIcon):
  367.         """
  368.         设置需要的QMessageBox的按钮提示为中文
  369.         :param qmessageIcon: 显示图标  例如QMessageBox.Question
  370.         :param kwargs: 确定=QMessageBox.AcceptRole
  371.         """
  372.         msgBox = QMessageBox()
  373.         msgBox.setWindowTitle(windowTitle)
  374.         msgBox.setText(text)
  375.         msgBox.setIcon(qmessageIcon)
  376.         msgBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
  377.         buttonY = msgBox.button(QMessageBox.Yes)
  378.         buttonY.setText('比赛暂停')
  379.         buttonN = msgBox.button(QMessageBox.No)
  380.         buttonN.setText('比赛结束')
  381.         ret=msgBox.exec_()
  382.         return ret
  383.     def setQMessageBoxoneButtonTextENToCN(self,windowTitle, text,  qmessageIcon):
  384.         """
  385.         设置需要的QMessageBox的按钮提示为中文
  386.         :param qmessageIcon: 显示图标  例如QMessageBox.Question
  387.         :param kwargs: 确定=QMessageBox.AcceptRole
  388.         """
  389.         msgBox = QMessageBox()
  390.         msgBox.setWindowTitle(windowTitle)
  391.         msgBox.setText(text)
  392.         msgBox.setIcon(qmessageIcon)
  393.         msgBox.setStandardButtons(QMessageBox.Yes)
  394.         buttonY = msgBox.button(QMessageBox.Yes)
  395.         buttonY.setText('是')
  396.         msgBox.exec_()
  397.     #根据输入框来读取信息已经无误
  398.     def func_race_info(self):
  399.         reply_one=self.setQMessageBoxtwoButtonTextENToCN('提示', '是否确认比赛准备信息无误?',QMessageBox.Question)
  400.         if reply_one == QMessageBox.No:   
  401.             self.setQMessageBoxoneButtonTextENToCN("提示","请继续填写",QMessageBox.Information)
  402.             return
  403.         #检查是否有未填写数据
  404.         if self.race_name.text()=='' or self.judge_number.text()=='' or self.judge_namelist.toPlainText()=='' or self.player_number.text()==''  or self.player_namelist.toPlainText()=='' or self.music_namelist.toPlainText()=='':
  405.             self.setQMessageBoxoneButtonTextENToCN("提示","有未填写数据",QMessageBox.Information)
  406.             return
  407.         
  408.         if self.remove_score.text()=='' and self.remove_yes_radiobox.isChecked()==True:
  409.             self.setQMessageBoxoneButtonTextENToCN("提示","有未填写数据",QMessageBox.Information)
  410.             return
  411.         #检查评委数量是否足够
  412.         if  int(self.judge_number.text())!=len(self.judge_namelist.toPlainText().split('\n')):
  413.             self.setQMessageBoxoneButtonTextENToCN("提示","评委数量与评委姓名数量不对应,请重新填写",QMessageBox.Information)
  414.             return
  415.         
  416.         #检查选手数量是否足够
  417.         if  int(self.player_number.text())!=len(self.player_namelist.toPlainText().split('\n')):
  418.             self.setQMessageBoxoneButtonTextENToCN("提示","选手数量与选手姓名数量不对应,请重新填写",QMessageBox.Information)
  419.             return
  420.         
  421.         #检查曲目数量是否足够
  422.         if  int(self.player_number.text())!=len(self.music_namelist.toPlainText().split('\n')):
  423.             self.setQMessageBoxoneButtonTextENToCN("提示","音乐数量与选手数量不对应,请重新填写",QMessageBox.Information)
  424.             return
  425.         if reply_one == QMessageBox.Yes:   
  426.             self.setQMessageBoxoneButtonTextENToCN("提示","比赛准备信息填写成功",QMessageBox.Information)         
  427.             self.score_table.setColumnCount(3)
  428.             self.score_table.setRowCount(int(self.player_number.text()))
  429.             column_namelist_temp=["抽签序号","选手姓名","曲目名称"]
  430.             self.score_table.setHorizontalHeaderLabels(column_namelist_temp) #设置行表头
  431.             player_namelist_temp=self.player_namelist.toPlainText().split('\n')
  432.             music_namelist_temp=self.music_namelist.toPlainText().split('\n')
  433.             for i in range(int(self.player_number.text())):
  434.                 self.score_table.setItem(i,0, QTableWidgetItem(str(i+1)))
  435.                 self.score_table.setItem(i,1, QTableWidgetItem(player_namelist_temp[i]))
  436.                 self.score_table.setItem(i,2, QTableWidgetItem(music_namelist_temp[i]))
  437.             #设置按钮可用
  438.             self.race_start.setEnabled(True)
  439.             self.save_info.setEnabled(True)
  440.             #给设置自适应宽度
  441.             self.score_table.resizeColumnToContents(0)
  442.             self.score_table.resizeColumnToContents(1)
  443.             self.score_table.resizeColumnToContents(2)
  444.             return
  445.         return
  446.     #这是按照全新比赛的操作
  447.     def func_race_start(self):
  448.         #先将读取的数据保存起来,以tablewight数据表信息为准
  449.         player_index=[]
  450.         player_name=[]
  451.         music_name=[]
  452.         for qtable_row in range(int(self.player_number.text())):
  453.             player_index.append(self.score_table.item(qtable_row,0).text())  #获取某行某列item中的x信息
  454.             player_name.append(self.score_table.item(qtable_row,1).text())  #获取某行某列item中的x信息
  455.             music_name.append(self.score_table.item(qtable_row,2).text())  #获取某行某列item中的x信息
  456.         
  457.         judge_all_list=[]
  458.         for qtable_column in range(int(self.judge_number.text())):
  459.             judge_one_list=[' ']*int(self.player_number.text()) #将列数据全部填充为空格
  460.             judge_all_list.append(judge_one_list)
  461.         # creating the DataFrame
  462.         all_data = pd.DataFrame(list(zip(player_index, player_name, music_name)))
  463.         all_data.columns =['抽签序号', '选手姓名', '曲目名称'] #设置列名
  464.         judge_namelist_temp=self.judge_namelist.toPlainText().split('\n')
  465.         for qtable_column in range(int(self.judge_number.text())):
  466.             judge_one_list=[' ']*int(self.player_number.text()) #将列数据全部填充为空格
  467.             judge_column_name=judge_namelist_temp[qtable_column]+":"+str(qtable_column+1)+"号评委"
  468.             all_data[judge_column_name]=judge_one_list
  469.         #增加最高分,最低分列 ,增加实际得分列
  470.         if self.remove_yes_radiobox.isChecked()==True:
  471.             max_one_list=[' ']*int(self.player_number.text()) #将列数据全部填充为空格
  472.             all_data['最高分']=max_one_list
  473.             min_one_list=[' ']*int(self.player_number.text()) #将列数据全部填充为空格
  474.             all_data['最低分']=min_one_list
  475.             visual_one_list=[-1]*int(self.player_number.text()) #将列数据全部填充为空格
  476.             all_data['实得分']=visual_one_list
  477.             index_one_list=[' ']*int(self.player_number.text()) #将列数据全部填充为空格
  478.             all_data['最终排名']=index_one_list
  479.             remove_score_str=self.remove_score.text()
  480.             self.remove_score_number=int(self.remove_score.text())
  481.             remove_one_list=[remove_score_str]*int(self.player_number.text()) #将列数据全部填充为空格
  482.             all_data['去掉几个最高分']=remove_one_list
  483.         else:
  484.             visual_one_list=[-1]*int(self.player_number.text()) #将列数据全部填充为空格
  485.             all_data['实得分']=visual_one_list
  486.             index_one_list=[' ']*int(self.player_number.text()) #将列数据全部填充为空格
  487.             all_data['最终排名']=index_one_list
  488.             remove_one_list=['0']*int(self.player_number.text()) #将列数据全部填充为空格
  489.             all_data['去掉几个最高分']=remove_one_list
  490.         all_data['抽签序号']=all_data['抽签序号'].astype(int)
  491.         all_data=all_data.sort_values(by=['抽签序号']) #按照抽签序号排序
  492.         all_data=all_data.reset_index(drop=True) #重新排列一下索引
  493.         all_data.to_excel('temp_data/'+str(self.race_name.text())+'_临时存储数据.xlsx', sheet_name='部分信息', index=True) # index false为不写入索引
  494.         self.all_data_df=all_data
  495.         #界面展示与隐藏
  496.         self.race_prepare.setVisible(False) #初始设置隐藏
  497.         self.race_going.setVisible(True) #初始设置隐藏
  498.         #设置比赛名称
  499.         self.race_going_name.setText(self.race_name.text())
  500.         # 展示当前选手信息,需要读取数据表的1号来展示
  501.         self.current_player.setText("当前选手:1号选手"+str(all_data.loc[0,'选手姓名']))
  502.         #根据评委数量来显示评委框
  503.         judge_number=int(self.judge_number.text())
  504.         judge_one_namelist=self.judge_namelist.toPlainText().split('\n')
  505.         for show_i in range(1,judge_number+1):
  506.             judge_one_label_name="judge_one_label_"+str(show_i)
  507.             judge_one_temp = self.race_going.findChild(QLabel,judge_one_label_name)
  508.             #设置评委label的text
  509.             judge_one_temp.setText(judge_one_namelist[show_i-1]+":"+str(show_i)+"号评委")
  510.             judge_one_temp.setVisible(True)
  511.             judgeone_score_input_name="judgeone_score_input_"+str(show_i)
  512.             judgeone_score_temp = self.race_going.findChild(QLineEdit,judgeone_score_input_name)
  513.             judgeone_score_temp.setVisible(True)
  514.         #根据是否需要去掉最高分和最低分来展示
  515.         if self.remove_yes_radiobox.isChecked()==True:
  516.             #去掉了最高分和最低分,那么就显示所有的
  517.             for show_i in range(1,5):
  518.                 judge_com_label_name="judge_com_label_"+str(show_i)
  519.                 judge_com_temp = self.race_going.findChild(QLabel,judge_com_label_name)
  520.                 judge_com_temp.setVisible(True)
  521.         else:
  522.             #不去掉,则只显示,实际得分
  523.             self.judge_com_average_label.setVisible(True)
  524.             self.judge_com_average.setVisible(True)
  525.         
  526.         return
  527.     #下一个选手
  528.     def func_next_player(self):
  529.         #获取数据,保存这个选手的得分到临时表格中
  530.         all_data_temp=self.all_data_df
  531.         print(self.all_data_df)
  532.         
  533.         #先询问是否计算最终得分,获取输入框信息,计算得分,然后展示出来,展示出来之后将信息保存到临时数据表中
  534.         reply_one=self.setQMessageBoxtwoButtonTextENToCN('提示', '是否跳到下一个选手?',QMessageBox.Question)
  535.         if reply_one == QMessageBox.Yes:   
  536.             #先判断选手是否是弃权
  537.             #确定当前计算的是哪个选手,至少有一个评委
  538.             current_player_row=0
  539.             #找到第一个未计分的选手
  540.             player_row=int(all_data_temp.shape[0])
  541.             print("player_row=",player_row)
  542.             for player_row_index in range(0,player_row):
  543.                 print(str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3]))
  544.                 print(str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3])=='-1')
  545.                 if str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3])=='-1' or str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3])=='-1.0':
  546.                     current_player_row=player_row_index
  547.                     break
  548.                 current_player_row=player_row_index
  549.             self.have_score_number=current_player_row+1
  550.             print("current_player_row=",current_player_row)
  551.             print("player_row=",player_row)
  552.             print("self.have_score_number=",self.have_score_number)
  553.             if self.have_score_number==player_row:
  554.                 #这时候比赛就提示已经统计完所有选手分数
  555.                 self.setQMessageBoxoneButtonTextENToCN("提示","已统计完所有选手分数",QMessageBox.Information)  
  556.                 self.current_player.setText("本场比赛所有选手已比赛完毕,请退出程序")
  557.                 #保存方法在有最高分和没有最高分时有所不同,有
  558.                 judge_number=0
  559.                 if int(all_data_temp.loc[0,'去掉几个最高分'])>0:
  560.                     judge_number=int(all_data_temp.shape[1])-8
  561.                 else:
  562.                     judge_number=int(all_data_temp.shape[1])-6
  563.                 #清空分数框
  564.                 for show_i in range(1,judge_number+1):
  565.                     judgeone_score_input_name="judgeone_score_input_"+str(show_i)
  566.                     judgeone_score_temp = self.race_going.findChild(QLineEdit,judgeone_score_input_name)
  567.                     judgeone_score_temp.clear()
  568.                     # judgeone_score_temp.setReadOnly(False)  #恢复成可修改
  569.                 if int(all_data_temp.loc[0,'去掉几个最高分'])>0:
  570.                     #设置最高分
  571.                     self.judge_com_max.setText("最高分: ")
  572.                     #设置最低分
  573.                     self.judge_com_min.setText("最低分: ")
  574.                     #设置最终分数
  575.                     self.judge_com_average.setText(str(''))
  576.                 else:
  577.                     #设置最终分数
  578.                     self.judge_com_average.setText(str(''))
  579.                 self.judgeone_score_1.setFocus() #设置光标
  580.                 #设置按钮不可点击
  581.                 self.next_player.setEnabled(False)
  582.                 #选手弃权按钮
  583.                 self.player_quit.setEnabled(False)
  584.                 return
  585.             else:
  586.                 judge_number=0
  587.                 if int(all_data_temp.loc[0,'去掉几个最高分'])>0:
  588.                     judge_number=int(all_data_temp.shape[1])-8
  589.                 else:
  590.                     judge_number=int(all_data_temp.shape[1])-6
  591.                 #current_player_row表示当前第一个空的数据选手序号,self.have_score_number表示已经填写的选手数据序号,
  592.                 # 如果不一样,说明这个选手弃权了,需要把所有数据填写完毕
  593.                 # 如果计算数据表里的和当前的一样,那就说明没有弃权
  594.                 print("self.have_score_number=",self.have_score_number)
  595.                 print("current_player_row=",current_player_row)
  596.                 #正常切换,只需要重新设置一些信息即可
  597.                 #清空分数框
  598.                 for show_i in range(1,judge_number+1):
  599.                     judgeone_score_input_name="judgeone_score_input_"+str(show_i)
  600.                     judgeone_score_temp = self.race_going.findChild(QLineEdit,judgeone_score_input_name)
  601.                     judgeone_score_temp.clear()
  602.                     judgeone_score_temp.setReadOnly(False)  #恢复成可修改
  603.                
  604.                 if int(all_data_temp.loc[0,'去掉几个最高分'])>0:
  605.                     #重新设置文字信息
  606.                     #设置下一个选手
  607.                     self.current_player.setText("当前选手:"+str(current_player_row+1)+"号选手")
  608.                     #设置最高分
  609.                     self.judge_com_max.setText("最高分: ")
  610.                     #设置最低分
  611.                     self.judge_com_min.setText("最低分: ")
  612.                     #设置最终分数
  613.                     self.judge_com_average.setText(str(''))
  614.                 else:
  615.                     #设置下一个选手
  616.                     self.current_player.setText("当前选手:"+str(current_player_row+1)+"号选手")
  617.                     #设置最终分数
  618.                     self.judge_com_average.setText(str(''))
  619.                
  620.                 self.judgeone_score_1.setFocus() #设置光标
  621.                 return
  622.               
  623.             return
  624.         else:
  625.             self.setQMessageBoxoneButtonTextENToCN("提示","用户取消操作",QMessageBox.Information)
  626.             return
  627.         return
  628.     def func_player_quit(self):
  629.         #获取数据,保存这个选手的得分到临时表格中
  630.         all_data_temp=self.all_data_df
  631.         print(self.all_data_df)
  632.         current_player_row=0
  633.         #先询问是否计算最终得分,获取输入框信息,计算得分,然后展示出来,展示出来之后将信息保存到临时数据表中
  634.         reply_one=self.setQMessageBoxtwoButtonTextENToCN('提示', '当前选手是否弃权?',QMessageBox.Question)
  635.         if reply_one == QMessageBox.Yes:   
  636.             #选手弃权
  637.             judge_number=0
  638.             if int(all_data_temp.loc[0,'去掉几个最高分'])>0:
  639.                 judge_number=int(all_data_temp.shape[1])-8
  640.             else:
  641.                 judge_number=int(all_data_temp.shape[1])-6
  642.             #清空分数框
  643.             for show_i in range(1,judge_number+1):
  644.                 judgeone_score_input_name="judgeone_score_input_"+str(show_i)
  645.                 judgeone_score_temp = self.race_going.findChild(QLineEdit,judgeone_score_input_name)
  646.                 judgeone_score_temp.clear()
  647.             #找到第一个未计分的选手
  648.             player_row=int(all_data_temp.shape[0])
  649.             print("player_row=",player_row)
  650.             for player_row_index in range(0,player_row):
  651.                 print(str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3]))
  652.                 print(str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3])=='-1')
  653.                 if str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3])=='-1' or str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3])=='-1.0':
  654.                     current_player_row=player_row_index
  655.                     break
  656.                 current_player_row=player_row_index
  657.             self.have_score_number=current_player_row
  658.             if self.have_score_number==player_row:
  659.                 #这时候比赛就提示已经统计完所有选手分数
  660.                 self.setQMessageBoxoneButtonTextENToCN("提示","已统计完所有选手分数",QMessageBox.Information)
  661.                 #设置按钮不可点击
  662.                 self.next_player.setEnabled(False)
  663.                 #选手弃权按钮
  664.                 self.player_quit.setEnabled(False)
  665.                 return
  666.             else:
  667.                 #保存方法在有最高分和没有最高分时有所不同,有
  668.                 if int(all_data_temp.loc[0,'去掉几个最高分'])>0:
  669.                 #将这里面的数据进行覆盖  操作的是save_score_list,score_list_temp_max,score_list_temp_min
  670.                     for judge_number_index in range(0,judge_number):
  671.                         print(judge_number_index)
  672.                         all_data_temp.iloc[current_player_row,judge_number_index+3]=0  
  673.                     
  674.                     all_data_temp.iloc[current_player_row,judge_number_index+4]=0
  675.                     all_data_temp.iloc[current_player_row,judge_number_index+5]=0
  676.                     all_data_temp.iloc[current_player_row,judge_number_index+6]=0
  677.                 else:
  678.                     for judge_number_index in range(0,judge_number):
  679.                         all_data_temp.iloc[current_player_row,judge_number_index+3]=0   
  680.                     
  681.                     all_data_temp.iloc[current_player_row,judge_number_index+4]=0
  682.                 print("弃权后all_data_temp=",all_data_temp)
  683.                 #重新保存数据表,最后再赋值回去
  684.                 all_data_temp.to_excel('temp_data/'+str(self.race_name.text())+'_临时存储数据.xlsx', sheet_name='部分信息', index=True) # index false为不写入索引
  685.                 self.all_data_df=all_data_temp
  686.                 self.have_score_number=self.have_score_number+1
  687.                 self.setQMessageBoxoneButtonTextENToCN("提示",str(current_player_row+1)+"号选手"+str(all_data_temp.loc[current_player_row,'选手姓名'])+"弃权成功,马上跳到下一个选手",QMessageBox.Information)
  688.                 if self.have_score_number==player_row:
  689.                     #这时候比赛就提示已经统计完所有选手分数
  690.                     self.setQMessageBoxoneButtonTextENToCN("提示","已统计完所有选手分数",QMessageBox.Information)
  691.                     self.current_player.setText("本场比赛所有选手已比赛完毕,请退出程序")
  692.                     #保存方法在有最高分和没有最高分时有所不同,有
  693.                     #清空分数框
  694.                     for show_i in range(1,judge_number+1):
  695.                         judgeone_score_input_name="judgeone_score_input_"+str(show_i)
  696.                         judgeone_score_temp = self.race_going.findChild(QLineEdit,judgeone_score_input_name)
  697.                         judgeone_score_temp.clear()
  698.                     if int(all_data_temp.loc[0,'去掉几个最高分'])>0:
  699.                         #设置最高分
  700.                         self.judge_com_max.setText("最高分: ")
  701.                         #设置最低分
  702.                         self.judge_com_min.setText("最低分: ")
  703.                         #设置最终分数
  704.                         self.judge_com_average.setText(str(''))
  705.                     else:
  706.                         #设置最终分数
  707.                         self.judge_com_average.setText(str(''))
  708.                     self.judgeone_score_1.setFocus() #设置光标
  709.                     #设置按钮不可点击
  710.                     self.next_player.setEnabled(False)
  711.                     #选手弃权按钮
  712.                     self.player_quit.setEnabled(False)
  713.                     return
  714.                 else:
  715.                     #跳转到下一个选手
  716.                     if int(all_data_temp.loc[0,'去掉几个最高分'])>0:
  717.                         self.current_player.setText("当前选手:"+str(current_player_row+2)+"号选手"+str(all_data_temp.loc[current_player_row+1,'选手姓名']))
  718.                         #设置最高分
  719.                         self.judge_com_max.setText("最高分: ")
  720.                         #设置最低分
  721.                         self.judge_com_min.setText("最低分: ")
  722.                         #设置最终分数
  723.                         self.judge_com_average.setText(str(''))
  724.                     else:
  725.                         #设置下一个选手
  726.                         self.current_player.setText("当前选手:"+str(current_player_row+2)+"号选手"+str(all_data_temp.loc[current_player_row+1,'选手姓名']))
  727.                         #设置最终分数
  728.                         self.judge_com_average.setText(str(''))
  729.                     self.judgeone_score_1.setFocus() #设置光标
  730.                     
  731.                 return
  732.         else:
  733.             self.setQMessageBoxoneButtonTextENToCN("提示","用户取消操作",QMessageBox.Information)
  734.             return
  735.     #结束比赛
  736.     def func_exit_race(self):
  737.         #获取数据,保存这个选手的得分到临时表格中
  738.         all_data_temp=self.all_data_df
  739.         print(self.all_data_df)
  740.         
  741.         reply_zero=self.setQMessageappENToCN('提示', '请选择退出程序的原因?',QMessageBox.Question)
  742.         if reply_zero == QMessageBox.Yes:
  743.             reply_one=self.setQMessageBoxtwoButtonTextENToCN('提示', '是否确认选择比赛暂停?',QMessageBox.Question)
  744.             if reply_one == QMessageBox.Yes:
  745.                 self.setQMessageBoxoneButtonTextENToCN("提示","比赛暂停,临时数据保存成功",QMessageBox.Information)
  746.                 sys.exit(0)
  747.                 return
  748.             else:
  749.                 self.setQMessageBoxoneButtonTextENToCN("提示","用户取消操作",QMessageBox.Information)
  750.                 return
  751.             return
  752.         else:
  753.             reply_two=self.setQMessageBoxtwoButtonTextENToCN('提示', '是否确认选择比赛结束?',QMessageBox.Question)
  754.             if reply_two == QMessageBox.Yes:
  755.                 #导出数据,清空临时表
  756.                 all_data_temp=all_data_temp.sort_values(by=['实得分'],ascending=False) #按照抽签序号排序
  757.                 all_data_temp=all_data_temp.reset_index(drop=True) #重新排列一下索引
  758.                
  759.                 player_row=int(all_data_temp.shape[0])
  760.                 print("player_row=",player_row)
  761.                 for player_row_index in range(0,player_row):
  762.                     all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-2]=player_row_index+1
  763.                 all_data_temp.to_excel('save_data/'+str(self.race_name.text())+'_最终数据全部备份版.xlsx', sheet_name='部分信息', index=True) # index false为不写入索引
  764.                 #保留特定数据
  765.                 all_data_temp_new = all_data_temp[['抽签序号', '选手姓名', '曲目名称','实得分','最终排名']]
  766.                
  767.                 # 创建一个新的文档
  768.                 doc_part=docx.Document()
  769.                 # 添加标题
  770.                 para_heading=doc_part.add_heading(str(self.race_name.text()), 5)
  771.                 para_heading.alignment=docx.enum.text.WD_ALIGN_PARAGRAPH.CENTER#设置为左对齐
  772.                 # 添加表格
  773.                 table_part = doc_part.add_table(rows=all_data_temp_new.shape[0]+1, cols=all_data_temp_new.shape[1])
  774.                 # 添加表头
  775.                 hdr_cells = table_part.rows[0].cells
  776.                 for i in range(all_data_temp_new.shape[1]):
  777.                     hdr_cells[i].text = all_data_temp_new.columns[i]
  778.                 # 添加每一行数据
  779.                 for i in range(all_data_temp_new.shape[0]):
  780.                     row_cells = table_part.rows[i+1].cells
  781.                     for j in range(all_data_temp_new.shape[1]):
  782.                         row_cells[j].text = str(all_data_temp_new.values[i,j])
  783.                 # 保存文件
  784.                 doc_part.save('save_data/'+str(self.race_name.text())+'_最终数据简洁版.docx')
  785.                 # del_files("temp_data/")
  786.                 self.setQMessageBoxoneButtonTextENToCN("提示","最终数据导出成功,本次比赛临时数据已清除",QMessageBox.Information)
  787.                 sys.exit(0)
  788.                 return
  789.             else:
  790.                 self.setQMessageBoxoneButtonTextENToCN("提示","用户取消操作",QMessageBox.Information)
  791.                 return
  792.             return
  793.         return
  794.     #根据文件来读取信息,这个是不一样的,最后写才对,这个继续前次比赛,比赛的信息设置与全新比赛不相同
  795.     def func_continue_race(self):
  796.         #先是询问是否继续上次比赛
  797.         reply_one=self.setQMessageBoxtwoButtonTextENToCN('提示', '是否继续上次比赛?',QMessageBox.Question)
  798.         if reply_one == QMessageBox.Yes:        
  799.             folderName, _ = QFileDialog.getOpenFileName(self, "选择xlsx文件", "", "*.xlsx")        
  800.             race_name=folderName.split("/")[-1].split("_")[0]
  801.             self.race_name.setText(race_name)
  802.             self.all_data_df=pd.read_excel('temp_data/'+folderName.split("/")[-1],index_col=0)
  803.             
  804.             all_data_temp=self.all_data_df
  805.             #界面展示与隐藏
  806.             self.race_prepare.setVisible(False) #初始设置隐藏
  807.             self.race_going.setVisible(True) #初始设置隐藏
  808.             #设置比赛名称
  809.             self.race_going_name.setText(race_name)
  810.             #设置选手初值
  811.             current_player_row=0
  812.             #找到第一个未计分的选手
  813.             player_row=int(all_data_temp.shape[0])
  814.             print("player_row=",player_row)
  815.             for player_row_index in range(0,player_row):
  816.                 print(str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3]))
  817.                 print(str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3])=='-1')
  818.                 if str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3])=='-1' or str(all_data_temp.iloc[player_row_index,int(all_data_temp.shape[1])-3])=='-1.0':
  819.                     current_player_row=player_row_index
  820.                     break
  821.                 current_player_row=player_row_index
  822.             self.have_score_number=current_player_row
  823.             judge_number=0
  824.             self.remove_score_number=int(all_data_temp.loc[0,'去掉几个最高分'])
  825.             
  826.             #设置界面信息:当前选手,是否展示实得分最高分,评委名字
  827.             if int(all_data_temp.loc[0,'去掉几个最高分'])>0:
  828.                 self.current_player.setText("当前选手:"+str(current_player_row+1)+"号选手")
  829.                 for show_i in range(1,5):
  830.                     judge_com_label_name="judge_com_label_"+str(show_i)
  831.                     judge_com_temp = self.race_going.findChild(QLabel,judge_com_label_name)
  832.                     judge_com_temp.setVisible(True)
  833.                 #设置最高分
  834.                 self.judge_com_max.setText("最高分: ")
  835.                 #设置最低分
  836.                 self.judge_com_min.setText("最低分: ")
  837.                 #设置最终分数
  838.                 self.judge_com_average.setText(str(''))
  839.                 judge_number=int(all_data_temp.shape[1])-8
  840.             else:
  841.                 #设置下一个选手
  842.                 self.current_player.setText("当前选手:"+str(current_player_row+1)+"号选手")
  843.                 self.judge_com_average_label.setVisible(True)
  844.                 self.judge_com_average.setVisible(True)
  845.                 #设置最终分数
  846.                 self.judge_com_average.setText(str(''))
  847.                 judge_number=int(all_data_temp.shape[1])-6
  848.             judge_namelist=[column for column in all_data_temp]
  849.             judge_one_namelist=judge_namelist[3:3+judge_number]
  850.             for show_i in range(1,judge_number+1):
  851.                 judge_one_label_name="judge_one_label_"+str(show_i)
  852.                 judge_one_temp = self.race_going.findChild(QLabel,judge_one_label_name)
  853.                 #设置评委label的text
  854.                 judge_one_temp.setText(judge_one_namelist[show_i-1].split(":")[0]+":"+str(show_i)+"号评委")
  855.                 judge_one_temp.setVisible(True)
  856.                 judgeone_score_input_name="judgeone_score_input_"+str(show_i)
  857.                 judgeone_score_temp = self.race_going.findChild(QLineEdit,judgeone_score_input_name)
  858.                 judgeone_score_temp.setVisible(True)
  859.         else:
  860.             self.setQMessageBoxoneButtonTextENToCN("提示","用户取消操作",QMessageBox.Information)
  861.         return
  862. if __name__ == '__main__':
  863.     app=QApplication(sys.argv)  
  864.     w = MyWindow()
  865.     w.ui.show()
  866.     app.exec()
复制代码
程序打包成exe

指令 安装pyinstall库
  1. 文件目录
  2. 根路径
  3.         getscore.py
  4.         assets
  5.                 xxx.ui
  6.         save_data
  7.         temp_data
  8.        
  9. pyinstaller -F -w getscore.py --add-data ".\\assets\\*;.\\assets"
复制代码
参考文章

感谢以下作者的知识分享
PyQt入门教程 - 随笔分类 - 锅边糊 - 博客园 (cnblogs.com)
【创作不易,望点赞收藏,若有疑问,请留言,谢谢】

来源:https://www.cnblogs.com/dongxuelove/p/18296159
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
来自手机

举报 回复 使用道具