def __init__(self): super().__init__() self.setObjectName("show_stu_widget") #self.check_stu_list() #一開始就執行動作 layout = QtWidgets.QVBoxLayout() header_label = LabelComponent(20, "Show Student") #"button_update"的設定 self.button_update = ButtonComponent("Update Student's Info") self.button_update.clicked.connect(self.check_stu_list) self.button_update.setEnabled(True) #"button_update"的設定 #創立"scroll_area" layout_scroll = QtWidgets.QVBoxLayout() #增加"layout_scroll" self.stu_screen = QWidget() #新增widget self.stu_screen.setMinimumSize(400, 200) #設定size self.stu_screen.setLayout(layout_scroll) self.scroll_area = QScrollArea() #新增scoll area self.scroll_area.setWidgetResizable(True) self.scroll_area.setWidget(self.stu_screen) #增加到widget裡 #創立"scroll_area" #增加label self.label_stu_list = LabelComponent(15, "") layout_scroll.addWidget(self.label_stu_list) #增加label #"layout"中增加widget;先增加的先出現 layout.addWidget(header_label, stretch=0.5) layout.addWidget(self.button_update, stretch=0.5) layout.addWidget(self.scroll_area, stretch=0.5) #"layout"中增加widget;先增加的先出現 self.setLayout(layout) #顯示layout
def __init__(self, update_widget_callback): super().__init__() self.setObjectName("menu_widget") self.update_widget_callback = update_widget_callback layout = QtWidgets.QVBoxLayout() add_button = ButtonComponent("Add student") add_button.setEnabled(True) show_button = ButtonComponent("Show all") show_button.setEnabled(True) add_button.clicked.connect(lambda: self.update_widget_callback("add")) show_button.clicked.connect( lambda: self.update_widget_callback("show")) layout.addWidget(add_button, stretch=1) layout.addWidget(show_button, stretch=1) self.setLayout(layout)
def __init__(self): super().__init__() self.setObjectName("modify_stu_widget") self.stu_list = {} self.stu_list["name"] = {} self.stu_list["scores"] = {} self.query_name = False self.modify_data = {} self.modify_data["stu_id"] = {} self.modify_data["scores_dict"] = {} layout = QtWidgets.QVBoxLayout() self.label_hint = HintLabelComponent(15, "") #Name layout_name = QtWidgets.QGridLayout() self.screen_name = QtWidgets.QWidget() self.screen_name.setLayout(layout_name) label_name = LabelComponent(16, "Name: ") self.edit_label_name = LineEditComponent("Name") self.edit_label_name.mousePressEvent = self.press_edit_label_name_action self.button_query = ButtonComponent("Query") self.button_query.clicked.connect(self.confirm_query) layout_name.addWidget(label_name, 0, 0, 1, 1) layout_name.addWidget(self.edit_label_name, 0, 1, 1, 1) layout_name.addWidget(self.button_query, 0, 2, 1, 1) #設定各別row所占的比例 layout_name.setRowStretch(0, 1) #設定各別row所占的比例 #設定各別col所占的比例 layout_name.setColumnStretch(0, 1) layout_name.setColumnStretch(1, 2) layout_name.setColumnStretch(2, 1) #設定各別col所占的比例 #Name #Change a current score layout_change = QtWidgets.QGridLayout() self.screen_change = QtWidgets.QWidget() self.screen_change.setLayout(layout_change) self.radio_button_change = QtWidgets.QRadioButton( 'Change a current score:') self.edit_label_score = LineEditComponent("") self.edit_label_score.mousePressEvent = self.press_edit_label_score_action self.combo_box_score = QtWidgets.QComboBox() self.combo_box_score.addItems(list()) self.combo_box_score.currentIndexChanged.connect( self.combo_box_select_changed) layout_change.addWidget(self.radio_button_change, 0, 0, 1, 1) layout_change.addWidget(self.combo_box_score, 1, 0, 1, 1) layout_change.addWidget(self.edit_label_score, 1, 1, 1, 1) #設定各別row所占的比例 layout_change.setRowStretch(0, 1) layout_change.setRowStretch(1, 1) #設定各別row所占的比例 #設定各別col所占的比例 layout_change.setColumnStretch(0, 1) layout_change.setColumnStretch(1, 4) layout_change.setColumnStretch(2, 1) #設定各別col所占的比例 #Change a current score #Add a new score layout_add = QtWidgets.QGridLayout() self.screen_add = QtWidgets.QWidget() self.screen_add.setLayout(layout_add) self.radio_button_add = QtWidgets.QRadioButton('Add a new score') label_subject = LabelComponent(16, "Subject: ") self.edit_label_subject = LineEditComponent("Subject") self.edit_label_subject.mousePressEvent = self.press_edit_label_subject_action label_score = LabelComponent(16, "Score: ") self.edit_label_score_2 = LineEditComponent("Score") self.edit_label_score_2.mousePressEvent = self.press_edit_label_score_2_action layout_add.addWidget(self.radio_button_add, 0, 0, 1, 1) layout_add.addWidget(label_subject, 1, 0, 1, 2) layout_add.addWidget(self.edit_label_subject, 1, 1, 1, 1) layout_add.addWidget(label_score, 2, 0, 1, 2) layout_add.addWidget(self.edit_label_score_2, 2, 1, 1, 1) #設定各別row所占的比例 layout_add.setRowStretch(0, 1) layout_add.setRowStretch(1, 1) layout_add.setRowStretch(2, 1) #設定各別row所占的比例 #設定各別col所占的比例 layout_add.setColumnStretch(0, 1) layout_add.setColumnStretch(1, 4) layout_add.setColumnStretch(2, 1) #設定各別col所占的比例 #Add a new score #Confirm layout_confirm = QtWidgets.QGridLayout() self.screen_confirm = QtWidgets.QWidget() self.screen_confirm.setLayout(layout_confirm) self.button_confirm = ButtonComponent("Confirm") self.button_confirm.clicked.connect(self.confirm_send) layout_confirm.addWidget(self.button_confirm, 0, 1, 1, 1) #設定各別row所占的比例 layout_confirm.setRowStretch(0, 1) #設定各別row所占的比例 #設定各別col所占的比例 layout_confirm.setColumnStretch(0, 4) layout_confirm.setColumnStretch(1, 1) #設定各別col所占的比例 #Confirm self.radio_button_change.toggled.connect( self.radio_button_change_on_clicked) self.radio_button_add.toggled.connect(self.radio_button_add_on_clicked) layout.addWidget(self.label_hint, stretch=1) layout.addWidget(self.screen_name, stretch=1) layout.addWidget(self.screen_change, stretch=1) layout.addWidget(self.screen_add, stretch=1) layout.addWidget(self.screen_confirm, stretch=1) self.setLayout(layout)
class ModifyWidget(QtWidgets.QWidget): def __init__(self): super().__init__() self.setObjectName("modify_stu_widget") self.stu_list = {} self.stu_list["name"] = {} self.stu_list["scores"] = {} self.query_name = False self.modify_data = {} self.modify_data["stu_id"] = {} self.modify_data["scores_dict"] = {} layout = QtWidgets.QVBoxLayout() self.label_hint = HintLabelComponent(15, "") #Name layout_name = QtWidgets.QGridLayout() self.screen_name = QtWidgets.QWidget() self.screen_name.setLayout(layout_name) label_name = LabelComponent(16, "Name: ") self.edit_label_name = LineEditComponent("Name") self.edit_label_name.mousePressEvent = self.press_edit_label_name_action self.button_query = ButtonComponent("Query") self.button_query.clicked.connect(self.confirm_query) layout_name.addWidget(label_name, 0, 0, 1, 1) layout_name.addWidget(self.edit_label_name, 0, 1, 1, 1) layout_name.addWidget(self.button_query, 0, 2, 1, 1) #設定各別row所占的比例 layout_name.setRowStretch(0, 1) #設定各別row所占的比例 #設定各別col所占的比例 layout_name.setColumnStretch(0, 1) layout_name.setColumnStretch(1, 2) layout_name.setColumnStretch(2, 1) #設定各別col所占的比例 #Name #Change a current score layout_change = QtWidgets.QGridLayout() self.screen_change = QtWidgets.QWidget() self.screen_change.setLayout(layout_change) self.radio_button_change = QtWidgets.QRadioButton( 'Change a current score:') self.edit_label_score = LineEditComponent("") self.edit_label_score.mousePressEvent = self.press_edit_label_score_action self.combo_box_score = QtWidgets.QComboBox() self.combo_box_score.addItems(list()) self.combo_box_score.currentIndexChanged.connect( self.combo_box_select_changed) layout_change.addWidget(self.radio_button_change, 0, 0, 1, 1) layout_change.addWidget(self.combo_box_score, 1, 0, 1, 1) layout_change.addWidget(self.edit_label_score, 1, 1, 1, 1) #設定各別row所占的比例 layout_change.setRowStretch(0, 1) layout_change.setRowStretch(1, 1) #設定各別row所占的比例 #設定各別col所占的比例 layout_change.setColumnStretch(0, 1) layout_change.setColumnStretch(1, 4) layout_change.setColumnStretch(2, 1) #設定各別col所占的比例 #Change a current score #Add a new score layout_add = QtWidgets.QGridLayout() self.screen_add = QtWidgets.QWidget() self.screen_add.setLayout(layout_add) self.radio_button_add = QtWidgets.QRadioButton('Add a new score') label_subject = LabelComponent(16, "Subject: ") self.edit_label_subject = LineEditComponent("Subject") self.edit_label_subject.mousePressEvent = self.press_edit_label_subject_action label_score = LabelComponent(16, "Score: ") self.edit_label_score_2 = LineEditComponent("Score") self.edit_label_score_2.mousePressEvent = self.press_edit_label_score_2_action layout_add.addWidget(self.radio_button_add, 0, 0, 1, 1) layout_add.addWidget(label_subject, 1, 0, 1, 2) layout_add.addWidget(self.edit_label_subject, 1, 1, 1, 1) layout_add.addWidget(label_score, 2, 0, 1, 2) layout_add.addWidget(self.edit_label_score_2, 2, 1, 1, 1) #設定各別row所占的比例 layout_add.setRowStretch(0, 1) layout_add.setRowStretch(1, 1) layout_add.setRowStretch(2, 1) #設定各別row所占的比例 #設定各別col所占的比例 layout_add.setColumnStretch(0, 1) layout_add.setColumnStretch(1, 4) layout_add.setColumnStretch(2, 1) #設定各別col所占的比例 #Add a new score #Confirm layout_confirm = QtWidgets.QGridLayout() self.screen_confirm = QtWidgets.QWidget() self.screen_confirm.setLayout(layout_confirm) self.button_confirm = ButtonComponent("Confirm") self.button_confirm.clicked.connect(self.confirm_send) layout_confirm.addWidget(self.button_confirm, 0, 1, 1, 1) #設定各別row所占的比例 layout_confirm.setRowStretch(0, 1) #設定各別row所占的比例 #設定各別col所占的比例 layout_confirm.setColumnStretch(0, 4) layout_confirm.setColumnStretch(1, 1) #設定各別col所占的比例 #Confirm self.radio_button_change.toggled.connect( self.radio_button_change_on_clicked) self.radio_button_add.toggled.connect(self.radio_button_add_on_clicked) layout.addWidget(self.label_hint, stretch=1) layout.addWidget(self.screen_name, stretch=1) layout.addWidget(self.screen_change, stretch=1) layout.addWidget(self.screen_add, stretch=1) layout.addWidget(self.screen_confirm, stretch=1) self.setLayout(layout) def init_action(self): self.label_hint.setText("") self.edit_label_name.setText("Name") self.edit_label_subject.setText("Subject") self.edit_label_score.clear() self.edit_label_score_2.setText("Score") self.button_query.setEnabled(False) self.button_confirm.setEnabled(False) def radio_button_change_on_clicked(self): selected_button = self.sender() if selected_button.isChecked(): print("{}".format(selected_button.text())) self.radio_button_add.setChecked(False) #將"radio_button_add"不要被選擇 def radio_button_add_on_clicked(self): selected_button = self.sender() if selected_button.isChecked(): print("{}".format(selected_button.text())) self.radio_button_change.setChecked( False) #將"radio_button_change"不要被選擇 def combo_box_select_changed(self, index): print("Index {} {} selected".format( index, self.combo_box_score.currentText())) def press_edit_label_name_action(self, event): self.edit_label_name.clear() self.button_query.setEnabled(True) self.query_name = False def press_edit_label_score_action(self, event): self.edit_label_score.clear() if self.query_name: self.button_confirm.setEnabled(True) self.radio_button_change.setChecked(True) else: self.label_hint.setText("Please query a new name first") def press_edit_label_subject_action(self, event): self.edit_label_subject.clear() if self.query_name: self.button_confirm.setEnabled(True) self.radio_button_add.setChecked(True) else: self.label_hint.setText("Please query a new name first") def press_edit_label_score_2_action(self, event): self.edit_label_score_2.clear() if self.query_name: self.button_confirm.setEnabled(True) self.radio_button_add.setChecked(True) else: self.label_hint.setText("Please query a new name first") def confirm_query(self): if (self.edit_label_name.text() == ""): #"name"如果是空字串就要再輸入一次 self.label_hint.setText("Please enter name for student.") else: self.button_query.setEnabled(False) self.stu_list["name"] = self.edit_label_name.text() self.stu_list["scores"] = {} print("self.stu_list : {}".format(self.stu_list)) self.query_name = True self.execute_query = ExcuteCommand(command="query", data=self.stu_list) self.execute_query.start() self.execute_query.return_sig.connect( self.query_action_result) #將信號連接到指定槽函數 # self.socket_client.send_command("query", self.stu_list) #先"send_command" # stu_raw_data = self.socket_client.wait_response() #才會有"wait_response" def query_action_result(self, result): #"json.loads" : 將已編碼的JSON解碼為Python對象 self.result = json.loads(result) if self.result["status"] == "OK": self.combo_box_score.clear() #先全部清除 self.combo_box_score.addItems(list( self.result["scores"].keys())) #再增加項目 self.modify_data["stu_id"] = self.result['stu_id'] self.modify_data["scores_dict"] = self.result['scores'] self.label_hint.setText("The student '{}' exists in DB".format( self.edit_label_name.text())) self.query_name = True else: self.label_hint.setText("The name {} is not found".format( self.edit_label_name.text())) def confirm_send(self): if self.radio_button_change.isChecked(): if self.edit_label_score.text() == "": self.label_hint.setText("Please enter the score") else: self.modify_data["scores_dict"][ self.combo_box_score.currentText( )] = self.edit_label_score.text() self.execute_confirm = ExcuteCommand(command="modify", data=self.modify_data) self.execute_confirm.start() self.execute_confirm.return_sig.connect( self.confirm_action_result) #將信號連接到指定槽函數 elif self.radio_button_add.isChecked(): if self.edit_label_subject.text() == "": self.label_hint.setText("Please enter the subject's name") elif self.edit_label_score_2.text() == "": self.label_hint.setText("Please enter the {}'s score".format( self.edit_label_subject.text())) else: self.modify_data["scores_dict"][self.edit_label_subject.text( )] = self.edit_label_score_2.text() self.execute_confirm = ExcuteCommand(command="modify", data=self.modify_data) self.execute_confirm.start() self.execute_confirm.return_sig.connect( self.confirm_action_result) #將信號連接到指定槽函數 def confirm_action_result(self, result): #"json.loads" : 將已編碼的JSON解碼為Python對象 self.result = json.loads(result) if self.result["status"] == "OK": if self.radio_button_change.isChecked(): stu_info = [ self.edit_label_name.text(), self.combo_box_score.currentText(), self.edit_label_score.text() ] self.label_hint.setText("Modify {} success".format(stu_info)) elif self.radio_button_add.isChecked(): stu_info = [ self.edit_label_name.text(), self.edit_label_subject.text(), self.edit_label_score_2.text() ] self.label_hint.setText("Add {} success".format(stu_info)) self.combo_box_score.clear() #先全部清除 self.combo_box_score.addItems( list(self.modify_data["scores_dict"].keys())) #再增加項目
class ShowStuWidget(QtWidgets.QWidget): def __init__(self): super().__init__() self.setObjectName("show_stu_widget") #self.check_stu_list() #一開始就執行動作 layout = QtWidgets.QVBoxLayout() header_label = LabelComponent(20, "Show Student") #"button_update"的設定 self.button_update = ButtonComponent("Update Student's Info") self.button_update.clicked.connect(self.check_stu_list) self.button_update.setEnabled(True) #"button_update"的設定 #創立"scroll_area" layout_scroll = QtWidgets.QVBoxLayout() #增加"layout_scroll" self.stu_screen = QWidget() #新增widget self.stu_screen.setMinimumSize(400, 200) #設定size self.stu_screen.setLayout(layout_scroll) self.scroll_area = QScrollArea() #新增scoll area self.scroll_area.setWidgetResizable(True) self.scroll_area.setWidget(self.stu_screen) #增加到widget裡 #創立"scroll_area" #增加label self.label_stu_list = LabelComponent(15, "") layout_scroll.addWidget(self.label_stu_list) #增加label #"layout"中增加widget;先增加的先出現 layout.addWidget(header_label, stretch=0.5) layout.addWidget(self.button_update, stretch=0.5) layout.addWidget(self.scroll_area, stretch=0.5) #"layout"中增加widget;先增加的先出現 self.setLayout(layout) #顯示layout def check_stu_list(self) : self.check_send = ExcuteCommand(command = "show", data = dict()) self.check_send.start() self.check_send.return_sig.connect(self.show_stu_list) #將信號連接到指定槽函數 def show_stu_list(self, result) : result = json.loads(result) student_list = result['parameters'] #提取"parameters"資料,也就是我們需要的"student_list" #self.hint_label.setText("Add {} successfully".format(self.stu_list)) #print("self.stu_list : {}".format(student_list)) #print ("\n==== student list ====") """ self.label_stu_list_top = QtWidgets.QLabel(self.stu_screen) self.label_stu_list_top.setText("====== student list ======") self.label_stu_list_top.setFont(QtGui.QFont("微軟正黑體", 15, QtGui.QFont.Bold)) """ i = 1 #控制移動座標 stu_list_content = "====== student list ======\n" for student_info in student_list : #print("student_info : \n{}".format(student_info)) #print("\nName : {}".format(student_info["name"])) stu_list_content += "\nName : {}\n".format(student_info["name"]) """ #顯示name在GUI self.label_name = QtWidgets.QLabel(self.stu_screen) self.label_name.setText("Name : {}".format(student_info["name"])) self.label_name.setFont(QtGui.QFont("微軟正黑體", 15, QtGui.QFont.Bold)) self.label_name.move(0, 40*i) #移動座標 #顯示name在GUI """ i = i+1 #只要顯示一行,就要移動位置 for subject in student_info["scores"] : scores = student_info["scores"] #print(type(subject)) #"str" #print(" subject : {}, score : {}".format(subject, scores[subject])) stu_list_content += " subject : {}, score : {}\n".format(subject, scores[subject]) """ #顯示subject和score在GUI self.label_sub_n_score = QtWidgets.QLabel(self.stu_screen) self.label_sub_n_score.setText(" subject : {}, score : {}".format(subject, scores[subject])) self.label_sub_n_score.setFont(QtGui.QFont("微軟正黑體", 15, QtGui.QFont.Bold)) self.label_sub_n_score.move(0, 40*i) i = i+1 #顯示subject和score在GUI """ #print(score.keys()) #print ("\n======================") stu_list_content += "\n======================\n" self.label_stu_list.setText(stu_list_content) #在GUI顯示"stu_list_content" #print(stu_list_content) """ self.label_stu_list_bottom = QtWidgets.QLabel(self.stu_screen) self.label_stu_list_bottom.setText("======================") self.label_stu_list_bottom.setFont(QtGui.QFont("微軟正黑體", 15, QtGui.QFont.Bold)) self.label_stu_list_bottom.move(0, 40*i) """ def load(self): self.check_stu_list() print("show widget")
def __init__(self): super().__init__() self.setObjectName("add_stu_widget") #"stu_list"初始化 self.stu_list = {} self.stu_list["name"] = {} self.stu_list["scores"] = {} #"stu_list"初始化 self.query_name = False #紀錄是否有輸入"name"且"query"過了 self.input_subject = False #紀錄是否有增加過"subject"和"score"了 layout = QtWidgets.QGridLayout() #相對的layout #設定widget header_label = LabelComponent(20, "Add Student") name_label = LabelComponent(16, "Name: ") subject_label = LabelComponent(16, "Subject: ") score_label = LabelComponent(16, "Score: ") self.hint_label = HintLabelComponent(15, "") self.edit_name_label = LineEditComponent("Name") self.edit_name_label.mousePressEvent = self.press_name_label_action self.edit_subject_label = LineEditComponent("Subject") self.edit_subject_label.mousePressEvent = self.press_subject_label_action self.edit_score_label = LineEditComponent() self.edit_score_label.mousePressEvent = self.press_score_label_action self.edit_score_label.setValidator(QtGui.QIntValidator(1, 100)) #限制只能輸入"int",且範圍在"三位數內" #"button_query"的設定 self.button_query = ButtonComponent("Query") self.button_query.clicked.connect(self.confirm_query) #"button_query"的設定 #"button_add"的設定 self.button_add = ButtonComponent("Add") self.button_add.clicked.connect(self.confirm_add) #"button_add"的設定 #"button_send"的設定 self.button_send = ButtonComponent("Send") self.button_send.clicked.connect(self.confirm_send) self.button_send.setEnabled(True) #初始設定將btn不能按,但"button_send"要可以按,所以設定為"True" #"button_send"的設定 #設定widget #layout widget layout.addWidget(header_label, 0, 0, 1, 2) #設定在(row, col)然後占用多少(row, col) layout.addWidget(name_label, 1, 0, 1, 1) layout.addWidget(subject_label, 2, 0, 1, 1) layout.addWidget(score_label, 3, 0, 1, 1) layout.addWidget(self.hint_label, 0, 3, 4, 2) layout.addWidget(self.edit_name_label, 1, 1, 1, 1) layout.addWidget(self.edit_subject_label, 2, 1, 1, 1) layout.addWidget(self.edit_score_label, 3, 1, 1, 1) layout.addWidget(self.button_query, 1, 2, 1, 1) layout.addWidget(self.button_add, 3, 2, 1, 1) layout.addWidget(self.button_send, 6, 3, 1, 1) #layout widget #設定各別col所占的比例 layout.setColumnStretch(0, 2) layout.setColumnStretch(1, 3) layout.setColumnStretch(2, 2) layout.setColumnStretch(3, 3.5) #設定各別col所占的比例 #設定各別row所占的比例 layout.setRowStretch(0, 1) layout.setRowStretch(1, 2) layout.setRowStretch(2, 2) layout.setRowStretch(3, 2) layout.setRowStretch(4, 2) layout.setRowStretch(5, 2) layout.setRowStretch(6, 2) #設定各別row所占的比例 self.setLayout(layout)
class AddStuWidget(QtWidgets.QWidget): def __init__(self): super().__init__() self.setObjectName("add_stu_widget") #"stu_list"初始化 self.stu_list = {} self.stu_list["name"] = {} self.stu_list["scores"] = {} #"stu_list"初始化 self.query_name = False #紀錄是否有輸入"name"且"query"過了 self.input_subject = False #紀錄是否有增加過"subject"和"score"了 layout = QtWidgets.QGridLayout() #相對的layout #設定widget header_label = LabelComponent(20, "Add Student") name_label = LabelComponent(16, "Name: ") subject_label = LabelComponent(16, "Subject: ") score_label = LabelComponent(16, "Score: ") self.hint_label = HintLabelComponent(15, "") self.edit_name_label = LineEditComponent("Name") self.edit_name_label.mousePressEvent = self.press_name_label_action self.edit_subject_label = LineEditComponent("Subject") self.edit_subject_label.mousePressEvent = self.press_subject_label_action self.edit_score_label = LineEditComponent() self.edit_score_label.mousePressEvent = self.press_score_label_action self.edit_score_label.setValidator(QtGui.QIntValidator(1, 100)) #限制只能輸入"int",且範圍在"三位數內" #"button_query"的設定 self.button_query = ButtonComponent("Query") self.button_query.clicked.connect(self.confirm_query) #"button_query"的設定 #"button_add"的設定 self.button_add = ButtonComponent("Add") self.button_add.clicked.connect(self.confirm_add) #"button_add"的設定 #"button_send"的設定 self.button_send = ButtonComponent("Send") self.button_send.clicked.connect(self.confirm_send) self.button_send.setEnabled(True) #初始設定將btn不能按,但"button_send"要可以按,所以設定為"True" #"button_send"的設定 #設定widget #layout widget layout.addWidget(header_label, 0, 0, 1, 2) #設定在(row, col)然後占用多少(row, col) layout.addWidget(name_label, 1, 0, 1, 1) layout.addWidget(subject_label, 2, 0, 1, 1) layout.addWidget(score_label, 3, 0, 1, 1) layout.addWidget(self.hint_label, 0, 3, 4, 2) layout.addWidget(self.edit_name_label, 1, 1, 1, 1) layout.addWidget(self.edit_subject_label, 2, 1, 1, 1) layout.addWidget(self.edit_score_label, 3, 1, 1, 1) layout.addWidget(self.button_query, 1, 2, 1, 1) layout.addWidget(self.button_add, 3, 2, 1, 1) layout.addWidget(self.button_send, 6, 3, 1, 1) #layout widget #設定各別col所占的比例 layout.setColumnStretch(0, 2) layout.setColumnStretch(1, 3) layout.setColumnStretch(2, 2) layout.setColumnStretch(3, 3.5) #設定各別col所占的比例 #設定各別row所占的比例 layout.setRowStretch(0, 1) layout.setRowStretch(1, 2) layout.setRowStretch(2, 2) layout.setRowStretch(3, 2) layout.setRowStretch(4, 2) layout.setRowStretch(5, 2) layout.setRowStretch(6, 2) #設定各別row所占的比例 self.setLayout(layout) def load(self): print("add widget") def press_name_label_action(self, event): self.edit_name_label.clear() self.button_query.setEnabled(True) self.query_name = False self.button_add.setEnabled(False) def press_subject_label_action(self, event): self.edit_subject_label.clear() #print(self.edit_name_label.text()) if not self.query_name : self.hint_label.setText("Please query a new name first") def press_score_label_action(self, event): self.edit_score_label.clear() if self.query_name : self.button_add.setEnabled(True) else : self.hint_label.setText("Please query a new name first") def confirm_query(self) : if(self.edit_name_label.text() == "") : #"name"如果是空字串就要再輸入一次 self.hint_label.setText("Please enter name for student.") else : self.button_query.setEnabled(False) self.stu_list["name"] = self.edit_name_label.text() self.stu_list["scores"] = {} print("self.stu_list : {}".format(self.stu_list)) self.query_name = True if(self.edit_subject_label.text() != "" and self.edit_score_label.text() != "") : self.button_add.setEnabled(True) self.execute_query = ExcuteCommand(command = "query", data = self.stu_list) self.execute_query.start() self.execute_query.return_sig.connect(self.query_action_result) #將信號連接到指定槽函數 # self.socket_client.send_command("query", self.stu_list) #先"send_command" # stu_raw_data = self.socket_client.wait_response() #才會有"wait_response" def query_action_result(self, result): #"json.loads" : 將已編碼的JSON解碼為Python對象 result = json.loads(result) if result["status"] == "OK" : self.hint_label.setText("The student '{}' already exists in DB".format(self.edit_name_label.text())) self.query_name = False else : self.hint_label.setText("Please enter subjects for student '{}'".format(self.edit_name_label.text())) def confirm_add(self) : #print(type(self.edit_subject_label.text())) #print(type(self.edit_score_label.text())) if(self.query_name == False) : #先確認有沒有"query_name" self.hint_label.setText("Please query a new name first") elif(self.edit_subject_label.text() == "") : #要先輸入"subject" self.hint_label.setText("Please input student's subject first.") elif(self.edit_score_label.text() == "") : #再輸入"score" self.hint_label.setText("Please enter student's {} grade.".format(self.edit_subject_label.text())) else : print(self.stu_list) self.stu_list["scores"][self.edit_subject_label.text()] = self.edit_score_label.text() self.hint_label.setText("Student {}'s subject '{}' with score '{}' added" .format(self.edit_name_label.text(), self.edit_subject_label.text(), self.edit_score_label.text())) self.input_subject = True def confirm_send(self): if self.query_name and self.input_subject : self.hint_label.setText(str(self.stu_list)) self.input_name = False self.input_subject = False self.edit_name_label.setText("Name") self.edit_subject_label.setText("Subject") self.edit_score_label.clear() self.button_add.setEnabled(False) #print(self.stu_list) self.execute_send = ExcuteCommand(command = "add", data = self.stu_list) self.execute_send.start() self.execute_send.return_sig.connect(self.send_action_result) #將信號連接到指定槽函數 else : self.hint_label.setText("Please input correct information.") def send_action_result(self, result): #"json.loads" : 將已編碼的JSON解碼為Python對象 result = json.loads(result) if result["status"] == "OK" : self.hint_label.setText("Add {} successfully".format(self.stu_list)) self.stu_list = {} #"self.stu_list"給reset掉 print("self.stu_list : {}".format(self.stu_list)) else : self.hint_label.setText("Add {} unsuccessfully".format(self.stu_list))