วิธีที่จะส่งตัวแปรไปฟังก์ชันเชื่อมโยงกับเป็นปุ่ม pyqt5 เป็นภาษาไพธอน[ปิด]

0

คำถาม

def open_browser(i):
            print("open")

 for i in range(5):
     new_name_label = 'name_label'+str(i)
     list_names.append(new_name_label)
     setattr(self, list_names[i], QPushButton(str(ordered_names[i]),self))
     exec(f'self.name_label{i}.setGeometry(250,{y_axis_name},340,110)')
     exec(f'self.name_label{i}.clicked.connect(open_browser({i}))')
     y_axis_name= y_axis_name + 110

"ฉัน"คือตัวแปรและผมอโดดถลาลองหาทางให้คลิกที่ปุ่มองตัวเองname_label และจากนั้นเชื่อมต่อนั้นกับฟังก์ชั่นและผ่านไปในที่แปรเปลี่ยน"ฉัน". ตอนที่ฉันพยายามวิ่งมันฉันได้ข้อผิดพลาด

image of error

มันดูเหมือนว่าเขาแปรเปลี่ยน"ฉัน"คือไม่ได้ถูกแทนที่ด้วยหนึ่งของตัวเลขที่อยู่ในช่วงถูกแทนที่ด้วย"ฉัน"และแทนที่จะเป็นฉันจดหมายพยายามที่จะผ่านเข้ามา

pyqt5 python
2021-11-22 17:19:19
1

คำตอบที่ดีที่สุด

1

ถ้าคุณต้องการที่จะกำหนดฟังก์ชันกับข้อโต้แย้งนั้นคุณสามารถใช้ได้ lambda เพื่อสร้างฟังก์ชันโดยไม่มีข้อโต้แย้ง

connect( lambda:open_browser(i) )

แต่ถ้าเธอวิ่งหนีมันอยู่ในวงนั้นคุณอาจจะต้องการยังต้องคัดลอกค่า i เพื่อตัวแปรใหม่.

connect( lambda x=i:open_browser(x) )

ถ้าคุณใช้โดยตรง i งั้นทั้งปุ่มจะใช้อ้างอิงถึงเพื่อตัวแปร iไม่ใช่คุณค่าจาก i -และในที่สุดทุกอตท่อนจะไปคนเดียวกันค่าสุดท้ายค่าได้รับมอบหมายให้ i ในเรื่อยๆ


รหัส connect(open_browser(i)) ทำงานเป็

result = open_browser(i) 
connect(result)

และเพราะว่า def open_browser() ไม่ได้ใช้ return ดังนั้นมันวิ่งโดยอัตโนมัติ return None และรหัสของคุณทำงานเหมือน

result = None
connect(result)

และคุณมี

connect(None)

และหลังจากนั้นเกิดข้อผิดพลาดแสดง Unexpected type "NoneType"


BTW:

ถ้านายใช้ for-เรื่องสร้างสิ่งนั้นดีกว่าใช้ list เพื่อให้พวกวัตถุ. มันไม่ต้องการ exec() และมันจะเป็นมากกว่าที่เป็นประโยชน์ต่อเพราะหลังคุณสามารถใช้อีกครั้ง for-เรื่องตรวจสวัตถุทั้งหมดออกจากรายการ

อีกอย่างมันดูแปลกๆเมื่อบางคนต้องการ exec() เพื่อสร้างรหัสมอส

self.buttons = []

for i in range(5):
     b = QPushButton(str(ordered_names[i]), self)
     b.setGeometry(250, y_axis_name, 340, 110)
     b.clicked.connect( lambda x=i:open_browser(x) )

     self.buttons.append( b )

     y_axis_name += 110     
2021-11-22 21:28:58

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่