PyQt5テスト:QTableWidgetに基づくアプリケーション
序文:
この記事の内容は、QtableWidgetコントロールに基づいており、時間管理の4象限思考を組み合わせて、単純なタスク優先順位計算機を作成しています。Python言語とPyQt5ライブラリをある程度理解している必要があります。PyQt5の簡単な紹介については、「PyQt5初心者テストレコード」(←クリック)シリーズの記事をご覧ください。
今日では、あらゆるカテゴリーが爆発する時代です。毎日、無数の新しいことに直面したり、あらゆる知識を学んだり、さまざまな計画を立てたりする必要があります。特に面倒なのは、最初に何をすべきですか?市場にはさまざまな時間管理アプリや作業計画アプリがあり、選択の困難や先延ばしに苦しむ人々のために自分の考えを明確にする方法を提供します。
私の毎日の勉強の中で、著者はまた、取り扱われる一連の業務の最初に何をすべきかについても悩みを感じています。時間管理の4つの象限の考え方を理解した後、私にはアイデアしかありませんでした。以下では、作者がタスクをスケジュールする方法を紹介します。
(要するに、私は何かを取ってQTableWidgetの関数を試してみました)上の図に示すように、時間管理の4つの象限です。重要と緊急の2つのラベルにより、この問題は4つのカテゴリに分類されます。これにより、ユーザーは緊急かつ重要なことを最初に行う必要があることを明確に理解できます。また、トランザクションアイテムが多い場合は、全体的な状況を管理し、各トランザクションの実行シーケンスを計画すると役立ちます。
この概念に従って、著者はさまざまな緊急度と重要度に応じてEXCELで小さなモデルを確立し、参照係数間隔を設定し、時間係数を追加しました。ユーザーのタスクの判断に応じて、3つの係数を入力して優先順位値を計算します。ここで著者が使用した優先値アルゴリズムは、緊急X0.6 +重要X0.4 +時間X0.1です。つまり、緊急性の高いものほど重みが大きく、時間を補助判別の調整値として使用します。
優先度の値を計算して並べ替えると、タスクの優先順位がわかります。(さて、ようやく記事執筆を最優先に!)
では、pyqt5を使ってこれを作成しましょう!(明らかにEXCELでの操作はより速いです)
マジックを使用してマジックを処理するには、テーブルを使用してテーブルを実装する必要があります。今回はQTableWidgetコントロールを使用します。まず、Qt Designerでドラッグアンドドロップしてインターフェイスを作成します。上段のボタンは基本的な機能で、下段のフレームはコアコントロールです。
QTableWidgetはQTableViewを継承しています。違いは、息子は十分に独立しておらず、父親が教える標準のデータモデルしか認識していないことですが、父親は知識が豊富で奇妙なデータを使用できます。そこで、私はここで未熟な息子を教育することを選択します(つまり、QTableViewに問題があります)。
__init__
追加する最初の変更方法cols
とrows
、可変の行数を表すテーブルの列数を、後続のCRUD操作で使用します。次に、QTableWidgetのサイズに適合するように各列の列幅を設定します。タスクアイテムの内容は不確定文字であるため、他の列はすべて数値です。つまり、幅は基本的に変更できないため、最初の列のみを設定することで手動で列幅を調整できます。
def __init__(self):
super(ReLearnForm, self).__init__()
self.setupUi(self)
self.cols = self.tableWidget.columnCount()
self.rows = 0 # 任务数
self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # 自适应列宽
self.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.Interactive) # 仅首列可手动调整
ここで、各ボタンの機能を実装します:
。1、
[ Read Meクリック仕様]ウィンドウはReadForm()
、Dialogクラスのカスタムを開きます。
def read(self):
self.d = ReadForm()
self.d.show()
self.d.setWindowTitle("参数说明")
2 +(増加タスク)
によってrows
ライン内の現在のタスクの数を記録します。
def add_row(self):
print('添加一行任务记录')
self.rows += 1
self.tableWidget.setRowCount(self.rows)
3.-(タスクの削除)
行を削除する前に、現在選択されている行を取得する必要があります。
変数__init__
を追加する方法でrow_flag
は、選択されたレコード(選択されていない場合)の行(最初の行0)にインデックスを付けるために使用されます。初期値は-1です。itemSelectionChanged
セル選択信号と溝カスタム関数をバインドすることにより、
self.row_flag = -1 # 当前被选中的行索引
self.result = []
self.tableWidget.itemSelectionChanged.connect(self.chioce) # 单元格选择改变
カスタムグルーブは修正choice()
を達成するために機能しrow_flag
ます。
def chioce(self): # 修改被选中的行索引
self.row_flag = self.tableWidget.currentRow()
print(f'选中第{self.row_flag + 1}行')
行を削除し、削除後にrows
それらを同時に変更し、リセットするメソッドを記述しますrow_flag
。
def del_row(self):
print('删除一行任务记录')
if self.row_flag == -1:
QMessageBox.about(self,'提醒','未选择要删除的行!')
else:
self.tableWidget.removeRow(self.row_flag) # 删除指定行
self.rows -= 1
self.row_flag = -1
4. X(タスクのクリア)
コントロールの行数を0に設定して、クリアを実行します。
def clean_rows(self):
print('清空任务记录')
reply = QMessageBox.question(self, '提示', '请确认是否要清空!', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
self.rows = 0
self.tableWidget.setRowCount(self.rows)
5. RUN(計算)
元に戻す操作を説明する前に、最初にRUNボタンによって実現される機能を説明します。
計算結果を一時的に保存するため__init__
のresult
変数を追加する方法では、
self.result = []
優先度の計算を実現する方法:①行ごとにトラバースし、4列のタスク名、緊急度、重要度、および時間係数の入力値を取得し、上記のルールに従って小数点以下2桁を保持するように丸められて優先度pを計算します、②セルにp値を追加して、選択可能および編集不可にします。セルを同じ行(インデックス4)の5番目の列(優先度の列)に配置します③最後に、各行の結果をリストに保存します。優先度を降順にしてからresult
、変数を保存します。
def prior_value(self):
print('计算优先度')
# print(f"共{self.row_nums}行{self.cols}列数据")
list_para = []
try:
for r in range(self.rows):
my_item = self.tableWidget.item(r, 0).text() # 任务名称
urgent = int(self.tableWidget.item(r, 1).text()) # 紧急程度
important = int(self.tableWidget.item(r, 2).text()) # 重要程度
t = int(self.tableWidget.item(r, 3).text()) # 时间系数
p = round(urgent*0.6 + important*0.4 + t*0.1,2) # 优先度
item_p = QTableWidgetItem(str(p)) # 将优先度值添加为单元格
item_p.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) # 设置为可选择、不可编辑
self.tableWidget.setItem(r, 4, item_p)
list_para.append([my_item, urgent, important, t, p])
self.result = sorted(list_para, key=lambda x: x[4], reverse=True) # 根据优先度将行元素列表降序
self.sort_move(self.result)
except:
pass
結果はこの時点で計算されますが、まだセルに調整されていないため、result
着信するsort_move()
追加処理の順序付きリストの結果は、現在の行インデックスがソートさresult
れた、書き換えセルの各列の取得値からnow
です。QTableWidgetは中心を均一に調整する機能を持たず、中心を設定するためにすべてのセルをもう一度トラバースする必要があります。
def sort_move(self, list_para_sorted): # 根据排序结果重写单元格
print('执行了sort')
for now in range(len(list_para_sorted)):
item_it = QTableWidgetItem(str(list_para_sorted[now][0]))
item_u = QTableWidgetItem(str(list_para_sorted[now][1]))
item_im = QTableWidgetItem(str(list_para_sorted[now][2]))
item_t = QTableWidgetItem(str(list_para_sorted[now][3]))
item_p = QTableWidgetItem(str(list_para_sorted[now][4]))
item_p.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) # 设置为可选择、不可编辑
print('得到了items')
self.tableWidget.setItem(now, 0, item_it)
self.tableWidget.setItem(now, 1, item_u)
self.tableWidget.setItem(now, 2, item_im)
self.tableWidget.setItem(now, 3, item_t)
self.tableWidget.setItem(now, 4, item_p)
print('设置了items')
for i in range(int(self.rows)): # 设置所有单元格文本居中
for j in range(int(self.cols)):
self.tableWidget.item(i, j).setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
最終結果は以下のようになり、これまでコア機能を実現しました。しかし、この(壊れたものをより印象的に見せるための)ツールをより完璧にするために、削除を取り消して結果をEXCELに保存する機能を実装し続けます。
6、←(左矢印-撤回)、最新のレコード変数を読み取ること
からresult
、回復の最初の行sort_move()
、コンテンツを復元する方法を再利用します。これは、sort_move()
メソッドのprior_value
理由に組み込まれるのではなく、メソッドとして記述された単一の方法です。
def return_result(self):
print('撤销操作')
print(self.result)
if self.result:
self.rows = len(self.result) # 恢复任务数
self.tableWidget.setRowCount(self.rows) # 恢复行
self.sort_move(self.result) # 恢复内容
注:行を削除してもコンテンツは応答しませんresult
。コンテンツを復元できる現在の変数が使用されます。
7.↓(下矢印保存)
(本当に味のない機能)今がパンダの時間です!場合はresult
空にしていない後、それは、行のデータフレームで行を書かれているEXCELファイルに保存し、呼び出すos.startfile('.xlsx')
ファイルを開くために。
def save(self):
print('保存结果')
if self.result:
# [my_item, urgent, important, t, p]
df = pd.DataFrame(columns=['任务项', '紧急程度', '重要程度', '时间系数', '优先度'])
for i in range(len(self.result)):
df.loc[i] = self.result[i]
df.to_excel('优先度结果表.xlsx', index = False)
os.startfile('优先度结果表.xlsx')
else:
QMessageBox.about(self,'提醒','未产生计算结果!')
最後に、実行可能プログラムにパッケージ化されたアイコンは、作者が描いた思考の鳩です(カッコウ、タスクがスケジュールされている場合でも、時間どおりに実行しません)。パッケージ化手順については、「PyQt5初心者テストレコード(3):Pyinstallerパッケージ化の概要」を参照してください。
このガジェットを完成させた後は、誰もがQTableWidgetコントロールの特性をある程度理解していると思います。それを自分のガジェットに適用しましょう!
読んでくれてありがとう!(ソースコードはgitubにアップロードされています:https : //github.com/SeonPan/ReLearn)