ส่งข้อความ PyQt QLineEdit เป็นพารามิเตอร์

ฉันกำลังพยายามแก้ไขวิดเจ็ต QLineEdit จากนั้นส่งข้อความใหม่เป็นพารามิเตอร์ไปยังฟังก์ชัน แต่จะส่งคืนข้อความต้นฉบับแทนข้อความใหม่เสมอ นี่คือตัวอย่างโค้ด

self.shortCoffee1Label = QLineEdit("0")
self.shortCoffee1Label.editingFinished.connect(self.sendValue(48, int(self.shortCoffee1Label.text())))

แล้วฟังก์ชัน sendValue

    def sendValue(self, var, val):
        def emmitValue():
            self.messageReceived.setText("Sending new value...")
            print("var received: " + str(var))
            print("val received: " + str(val))
            self.thread.sendValue(var, val)
        return emmitValue

แต่ค่า val จะเป็น 0 เสมอ ซึ่งเป็นค่าเดิมที่ตั้งไว้ ผมทำอะไรผิดหรือเปล่า?


person lmagalhaes    schedule 06.04.2020    source แหล่งที่มา
comment
โดยพื้นฐานแล้วสิ่งที่บุคคลที่ใช้นิพจน์ Lambda ที่ไม่จำเป็นและซับซ้อนกว่าไม่ได้บอกคุณก็คือ เมื่อใช้คำสั่ง Connect คุณจะไม่ได้ระบุมันด้วยการเรียกใช้ฟังก์ชัน - หรือที่เรียกว่า Function() แต่คุณระบุด้วยฟังก์ชัน - หรือที่เรียกว่า Function ถ้าคุณมีพารามิเตอร์ คุณต้องการที่จะส่งผ่านคุณทำสิ่งนั้นภายในฟังก์ชันนั้น เพื่อเราจะได้สิ่งนี้ self.shortCoffee1Label.editingFinished.connect(self.SendNewValue) จากนั้นใน def SendNewValue(self): คุณจะมีบรรทัดที่เรียกสิ่งที่คุณต้องการโดยใช้พารามิเตอร์ดังต่อไปนี้:   -  person Dennis Jensen    schedule 06.04.2020
comment
self.sendValue(48, int(self.shortCoffee1Label.text())) และนั่นคือทั้งหมดที่คุณต้องการภายในฟังก์ชันนั้น หรือมีวิธีอื่นในการทำเช่นนี้ที่ซับซ้อนน้อยกว่าการเพิ่มนิพจน์ Lambda เนื่องจากละเมิด K.I.S.S. กฎของการเขียนโปรแกรม (Keep It Simple and Smart) โดยการเพิ่มความซับซ้อนที่ไม่จำเป็นเพื่อจัดวางโค้ดให้มากที่สุดในบรรทัดเดียวเท่าที่จะทำได้ ซึ่งได้รับการพิสูจน์แล้วว่าเป็นวิธีการที่ไม่ดีเมื่อนานมาแล้ว   -  person Dennis Jensen    schedule 06.04.2020
comment
แต่เนื่องจากฉันต้องการมี QLineEdits หลายตัวเพื่อส่งฟังก์ชัน sendValue นั้น ฉันจึงต้องมีทั้งสองพารามิเตอร์ - var คือ lineedit ที่ส่งค่า และ val คือค่าของการแก้ไขบรรทัด ถ้าผมทำแบบที่คุณเสนอ ผมคงได้แต่โยนค่าออกมา และไม่รู้ว่า edit จากบรรทัดไหนใช่ไหม?   -  person lmagalhaes    schedule 07.04.2020


คำตอบ (2)


หากคุณชอบให้โปรแกรมจะเก็บค่า "0" แล้วแนบไปกับ editFinished แทนการรีเฟรชทุกครั้งที่คุณเรียกใช้ฟังก์ชัน ดังนั้น คุณควรใช้ lambda (ขออภัยสำหรับภาษาอังกฤษที่ไม่ดีของฉัน):

self.shortCoffee1Label = QLineEdit("0")
self.shortCoffee1Label.editingFinished.connect(lambda: self.sendValue(48, int(self.shortCoffee1Label.text())))
person Amin Guermazi    schedule 06.04.2020
comment
การเพิ่มแลมบ์ดาทำให้โปรแกรมไม่รันฟังก์ชันเลย - person lmagalhaes; 06.04.2020

เข้าใจแล้ว.

นี่คือรหัสสุดท้าย:

self.shortCoffee1Label.editingFinished.connect(self.sendValue(48, self.shortCoffee1Label))

 def sendValue(self, var, val):
        def emmitValue():
            self.messageReceived.setText("Sending new value...")
            print("var received: " + str(var))
            print("val received: " + str(int(val.text())))
            self.thread.sendValue(var, int(val.text()))
        return emmitValue

แนวคิดก็คือการส่งวัตถุเป็นพารามิเตอร์เพื่อให้ฉันสามารถดึงข้อความที่อัปเดตได้ ปรากฎว่าอาจตีความว่าเป็น "ส่งข้อความที่วัตถุนี้มีตอนคอมไพล์" ปัญหาได้รับการแก้ไขแล้วโดยการส่งออบเจ็กต์เอง

person lmagalhaes    schedule 06.04.2020