ข่าวสารทางเทคนิคเกี่ยวกับ PySimpleGUI
(github.com/PySimpleGUI)- หลังจากยุติความพยายามเชิงพาณิชย์ PySimpleGUI ได้นำ ส่วนประกอบด้านไลเซนส์และความปลอดภัย ออกจาก โค้ด PySimpleGUI 5 แล้วเปิดเผยอีกครั้งบน GitHub และ PyPI ในชื่อ PySimpleGUI 6 ภายใต้ ไลเซนส์ LGPL3
- เวอร์ชันล่าสุดสามารถติดตั้งได้ด้วย
python -m pip install PySimpleGUIและยังสามารถติดตั้งเวอร์ชันก่อนหน้า4.60.5.1,masterบน GitHub หรือรีลีสเฉพาะอย่าง6.1ผ่าน pip ได้โดยตรง - PySimpleGUI ถูกอธิบายว่าเป็น wrapper ของไลบรารี GUI เช่น tkinter ที่ทำให้ GUI SDK มีโครงสร้างที่เรียบง่ายและกระชับขึ้น พร้อมทั้งยังปรับแต่งรายละเอียดได้ และไม่จำเป็นต้องมีประสบการณ์เขียนโปรแกรม GUI มาก่อน
- เวอร์ชัน 6.2 มีการแก้บั๊ก
Window.settings_save, การแสดงภาพแบบ inline ใน Multiline,psgupgrade, การเลือกโหนด Tree แบบโปรแกรม, ตัวตั้งเวลาแบบสตริง"H:M:S"สำหรับWindow.start_timerและการตั้งค่าสีขอบของ Frame - โปรเจ็กต์ยังคงดูแลในรูปแบบที่ไม่รับ pull request และอนาคตระยะยาวยังไม่แน่นอน แต่ผู้เขียนระบุว่าจะยังคงเขียนโค้ดและจัดระเบียบ ecosystem ต่อไป
การกลับมาเป็นโอเพนซอร์สของ PySimpleGUI 6
- PySimpleGUI เคยพยายามทำเป็นเชิงพาณิชย์ แต่ไม่สามารถสร้างทรัพยากรที่เพียงพอต่อการเดินหน้าโปรเจ็กต์ในระดับที่คาดหวังได้
- มีการประกาศยุติ PySimpleSoft ในเดือนกุมภาพันธ์ 2025 และจะให้การสนับสนุนต่อถึงปลายปี 2025 หลังจากนั้นสิ่งที่เหลือคือการตัดสินใจว่าจะจัดการกับโค้ด เอกสาร และรีโพซิทอรีอย่างไร
- โค้ดของ PySimpleGUI 5 ถูกนำ ส่วนประกอบด้านไลเซนส์และความปลอดภัย ออก แล้วเผยแพร่บน GitHub และ PyPI
- เวอร์ชันที่เปิดเผยใหม่นี้ใช้ ไลเซนส์ LGPL3
- คอร์ส Udemy จะเปิดให้ใช้ฟรีช่วงหนึ่ง โดยโค้ดคูปองคือ
033334A16163C571B739
วิธีติดตั้ง
- ติดตั้งเวอร์ชันล่าสุด v6 จาก PyPI:
python -m pip install PySimpleGUI
- ติดตั้งเวอร์ชันก่อนหน้า
4.60.5.1:python -m pip install PySimpleGUI==4.60.5.1
- สามารถติดตั้งโค้ดล่าสุดจากรีโพซิทอรี GitHub ได้โดยตรง:
python -m pip install --upgrade https://github.com/PySimpleGUI/PySimpleGUI/zipball/master
- หากต้องการติดตั้งรีลีสเฉพาะจาก GitHub ให้เปลี่ยน
masterเป็นหมายเลขรีลีส:python -m pip install --upgrade https://github.com/PySimpleGUI/PySimpleGUI/zipball/6.1
- สามารถ clone หรือดาวน์โหลดรีโพซิทอรี แล้วติดตั้งจากเครื่องภายในได้เช่นกัน:
python -m pip install .
บทบาทของ PySimpleGUI
- PySimpleGUI เป็น wrapper ที่ครอบ tkinter และไลบรารี GUI อื่น ๆ
- มันทำให้ GUI SDK มีโครงสร้างที่เรียบง่ายและกระชับขึ้น ขณะเดียวกันก็ยังเปิดให้ปรับแต่งรายละเอียดได้
- มีการแนะนำว่าไม่จำเป็นต้องมีประสบการณ์เขียนโปรแกรม GUI มาก่อน
- ตัวอย่างใน README แสดงการสร้างแอปหน้าต่างแบบโต้ตอบได้ด้วยเพียง
Text,Input,Button,Window, event loop,window.read()และwindow.close() - เอกสารถูกเผยแพร่ที่ Docs.PySimpleGUI.com
แนวทางการพัฒนาและมุมมองระยะยาว
- มีการอธิบายว่า PySimpleGUI ถูกพัฒนาในรูปแบบที่ ใกล้เคียงผลิตภัณฑ์แบบปิดมากกว่า โปรเจ็กต์โอเพนซอร์สดั้งเดิม
- ไม่รับ pull request
- อนาคตในระยะยาวยังไม่ชัดเจน แต่ปัจจุบันผู้เขียนยังสนุกกับการเขียนโค้ดและช่วยเหลือผู้อื่น
- ผู้เขียนอธิบายว่าประสบการณ์กับ PySimpleGUI เป็นประสบการณ์แบบ “once-in-a-lifetime” ที่ได้เห็นสิ่งที่ผู้คนสร้างขึ้น
ฟีเจอร์และการแก้ไขในเวอร์ชัน 6.2
- เวอร์ชัน 6.2 รวมการแก้บั๊ก
Window.settings_save - เพิ่มความสามารถในการ “print” รูปภาพแบบ inline ในองค์ประกอบ Multiline
- ความสามารถในการอัปเกรดไปยัง maintenance release ล่าสุดถูกนำกลับมาไว้ใน PySimpleGUI อีกครั้ง
- สามารถใช้ Home Window หรือคำสั่ง
psgupgrade - สามารถดู release notes และติดตั้งเวอร์ชันใหม่ได้
- สามารถใช้ Home Window หรือคำสั่ง
- มีการแก้บั๊ก #5750 ที่ทำให้เหตุการณ์
Graphเข้าสู่ลูปไม่สิ้นสุดเมื่อได้รับเหตุการณ์write_event_value- แก้โดยล้าง real-time button flag
- มีการระบุว่าขอบเขตการเปลี่ยนแปลงจำกัดอยู่ในเงื่อนไขขององค์ประกอบ Graph จึงมีโอกาสเกิด regression ต่ำ
- เพิ่มพารามิเตอร์
select_node_keysให้กับTree.updateเพื่อให้สามารถเลือกโหนดใน tree แบบโปรแกรมได้เหมือนกับการเลือกโดยผู้ใช้ - มีการปรับฟังก์ชันและพารามิเตอร์
echo_stdout_stderrของ Multiline- จะ echo เฉพาะเมื่อมีการ reroute stdout หรือ stderr ไปยังองค์ประกอบนั้น
- ฟังก์ชันนี้ไม่ได้ทำการ reroute เองโดยตรง
- การแก้ไข #6686 ช่วยแก้ปัญหาที่ปุ่ม Calendar chooser ล้างฟิลด์ที่ควรถูกล้างเฉพาะตอน
window.readคืนค่าเท่านั้น - Home Window แสดงหมายเลขเวอร์ชันของ maintenance release และมีการย้ายตำแหน่งปุ่มติดตั้ง
- เมื่อเรียก
Window.start_timerสามารถระบุตัวตั้งเวลาด้วยสตริง"H:M:S"ได้ - เพิ่มความสามารถให้ Column แบบเลื่อนได้รองรับการเลื่อนแนวนอนอย่างเดียว
- องค์ประกอบ Frame เพิ่มพารามิเตอร์
border_color,border_width_no_reliefเพื่อกำหนด สีขอบ- สีขอบของ Frame จะใช้สีขององค์ประกอบข้อความเป็นค่าเริ่มต้นหากไม่ได้กำหนดแยกไว้
- ส่วน call reference ของเอกสารถูกอัปเดตให้ตรงกับรีลีส 6.2
Drag and drop และโปรเจ็กต์รอบข้าง
- มีการอธิบายว่า drag and drop เป็นฟีเจอร์ที่ต้องการมานาน และพบวิธีทำในพื้นที่โค้ดของผู้ใช้โดยไม่ต้องแก้โค้ดของ PySimpleGUI
psgdndเป็นแพ็กเกจใหม่ที่เพิ่ม drag and drop ให้ PySimpleGUI- สามารถติดตั้งผ่าน pip แล้วใช้งานได้
- มีข้อมูลและตัวอย่างเพิ่มเติมในรีโพซิทอรีดังกล่าว
psgdnd6.0.1 ถูกปล่อยบน PyPI และทำงานบน Windows- เวอร์ชัน 6.0.2 บน GitHub มีการแก้ไขที่จำเป็นสำหรับ Linux
- สถานะการรองรับ Mac ยังไม่ทราบแน่ชัด
- รีโพซิทอรี
PSGMicroPythonได้เพิ่มโค้ดสำหรับเชื่อมต่อกับไมโครคอนโทรลเลอร์ที่ใช้ MicroPython- ทำงานบน Raspberry Pi Pico และ ESP32
- อาจทำงานบนบอร์ดอื่นได้ด้วย
- ไม่ได้ตั้งใจให้เป็นโปรเจ็กต์ขนาดใหญ่หรือมีความทนทานสูง แต่แนะนำว่าเป็นโค้ดที่อาจมีประโยชน์
ต้นแบบ PSGWeb
- PSGWeb เป็นโปรโตไทป์ที่ทำให้ PySimpleGUI ทำงานใน หน้าต่างเบราว์เซอร์
- มันทำงานได้กับโปรแกรมเดโมส่วนใหญ่
- สามารถลองรันได้โดยเติม
psgweb.usไว้หน้าที่อยู่ URL ของแอปพลิเคชัน PySimpleGUI บน GitHub- ตัวอย่าง:
https://github.com/PySimpleGUI/PySimpleGUI/… - ตัวอย่างที่แปลงแล้ว:
https://psgweb.us/github.com/PySimpleGUI/…
- ตัวอย่าง:
- PSGWeb ถูกสร้างขึ้นเป็นส่วนหนึ่งของงาน PSG 5 ที่ใหญ่กว่า แต่ไม่เคยถูกเผยแพร่
- ไม่มีแผนจะปล่อยหรือขยายต้นแบบนี้
มุมมองต่อการใช้ AI
- ผู้เขียนใช้ LLM เพื่อค้นหาและสรุปเอกสาร ตรวจสอบข้อผิดพลาด สืบค้น และเรียนรู้ความรู้ใหม่
- ไม่ใช้ LLM เขียนโค้ด
- เหตุผลคือ ชอบการเขียนโค้ดเอง
- ผู้เขียนอธิบายว่าการที่โปรเจ็กต์ไม่เปิดรับ pull request ก็เพราะอยากเขียนโค้ดเองมากกว่ามีคนอื่นมาเขียนให้
- สำหรับคำถามว่า PySimpleGUI ยังเกี่ยวข้องในยุค AI หรือไม่ ผู้เขียนมองว่าเพียงแค่ยังมีคนค้นพบ ติดตั้ง และมีอย่างน้อยหนึ่งคนใช้งานทุกวันก็เพียงพอแล้ว
- ผู้เขียนบอกว่านึกภาพการสร้างแอป Windows โดยไม่มี PySimpleGUI ได้ยาก
- โดยอธิบายว่าในงานล่าสุดกับคอมพิวเตอร์ breadboard 6502 ได้ใช้ Raspberry Pi Pico สองตัวร่วมกับแอป PySimpleGUI เพื่อสร้าง bus analyzer
- และสามารถสร้างแอป frontend บน Windows เพื่อควบคุมเครื่องมือได้อย่างง่ายดายด้วย PySimpleGUI
ประวัติโปรเจ็กต์และปัญหาเงินทุน
- PySimpleGUI เริ่มต้นในปี 2018 จาก โค้ดใช้ครั้งเดียว ที่สร้างขึ้นเพราะต้องการ GUI สำหรับต้นแบบ media player
- เป้าหมายคือครอบ Tkinter ให้ทำงานได้เร็วขึ้นในรูปแบบที่เป็นเส้นตรงและเข้าใจง่ายกว่า โดยไม่ต้องมีประสบการณ์กับเฟรมเวิร์ก GUI เชิงวัตถุมาก่อน
- ผู้เขียนนำขึ้น GitHub โดยไม่มีประสบการณ์กับ Python หรือโอเพนซอร์ส และเข้าหาโปรเจ็กต์นี้ในแบบคล้ายสตาร์ทอัปมากกว่าโอเพนซอร์สดั้งเดิม
- ไทม์ไลน์:
- กรกฎาคม 2018: Version 1
- มิถุนายน 2019: Version 4
- มกราคม 2020: ปัญหาเงินทุนกลายเป็นความกังวลหลัก และเริ่มมีการกล่าวถึงการทำเชิงพาณิชย์
- พฤศจิกายน 2020: ประกาศคอร์ส Udemy และเพิ่มคำขอความช่วยเหลือสาธารณะ
- ธันวาคม 2021: เปิดตัวคอร์ส
- กุมภาพันธ์ 2024: เปิดตัว Version 5 เชิงพาณิชย์
- เมษายน 2026: Version 6
- Announcements Issue บน GitHub ถูกใช้เหมือนบล็อกที่เก็บบันทึกประวัติโปรเจ็กต์ และขยายไปมากกว่า 1,700 รายการ
- เพื่อให้อ่านง่ายขึ้น มีการเผยแพร่ snapshot ไว้ที่แท็บ Announcements 2018-2024 ในเอกสาร
- การทำโอเพนซอร์สเต็มเวลาสร้างแรงกดดันทางการเงินอย่างฉับพลันและต่อเนื่อง
- การสนับสนุนและการบริจาคผ่าน GitHub Sponsors และ Buy Me a Coffee แม้ในช่วงสูงสุดก็อยู่ที่ราว 150 ดอลลาร์ต่อเดือน
- คอร์ส Udemy 61 บทเรียน ความยาว 11.5 ชั่วโมง เคยขึ้นไปได้ราว 2,000 ดอลลาร์ต่อเดือน ในช่วงแรก ก่อนจะลดลงเหลือต่ำกว่า 100 ดอลลาร์
- ทั้งสองแนวทางไม่เพียงพอสำหรับการรักษาโปรเจ็กต์ในระยะยาว
ผลลัพธ์ของการทำเชิงพาณิชย์และประสบการณ์ด้านไลเซนส์
- การเปิดตัวผลิตภัณฑ์แบบเสียเงินของ Version 5 ไม่ใช่การตัดสินใจแบบฉับพลัน แต่มีการพูดคุยอย่างเปิดเผยมาหลายปีใน README และประกาศต่าง ๆ
- เวอร์ชันเชิงพาณิชย์ถูกเปิดตัวในต้นปี 2024 หลังจากทางเลือกอื่นหมดลง
- เป้าหมายคือรักษาการเข้าถึงได้ง่าย มากกว่าการสร้างกำแพงกีดกัน
- แม้จะไม่ประสบความสำเร็จในเชิงความยั่งยืนทางการเงิน แต่ก็สรุปว่าเป็นประสบการณ์ที่มีคุณค่าในแง่ของประสบการณ์ การเรียนรู้ และความสัมพันธ์
- หลังการทำเชิงพาณิชย์ไม่ได้สูญเสียผู้ใช้ส่วนใหญ่ และหลายบริษัทยังคงใช้ PySimpleGUI ต่อไป
- ปัญหาคือการทำให้บริษัทต่าง ๆ ซื้อไลเซนส์
- มีการเลือกใช้ Hobbyist License ซึ่งให้ผู้ใช้สายงานอดิเรกและนักเรียนใช้ฟรี ขณะที่บริษัทต้องจ่ายเงิน
- ในทางปฏิบัติ ผู้ใช้ส่วนใหญ่นิยามตัวเองว่าเป็นผู้ใช้สายงานอดิเรก
- มีผู้ใช้ในองค์กรนับหมื่นลงทะเบียนใน free tier และไม่ใช่เรื่องแปลกที่แม้แต่บริษัทใหญ่จะมีผู้ใช้หลายร้อยคน แต่มีไลเซนส์แบบเสียเงินเพียงไม่กี่ราย
- ผู้เขียนระบุว่าไม่เสียใจกับการตัดสินใจเปิดตัวเลือกฟรี
- ข้อสรุปส่วนตัวคือมีความคาดหวังทางวัฒนธรรมอย่างแรงกล้าว่าเครื่องมือและไลบรารี Python ควรต้องฟรี
- ปัญหาหลักดูไม่ใช่เรื่องราคา หรือความไม่พอใจ ผู้คนยังคงใช้ PySimpleGUI แต่ไม่รู้สึกว่ามีหน้าที่ต้องจ่ายเงิน
- แม้มีเงื่อนไขไลเซนส์ที่ชัดเจน ก็ไม่ได้เปลี่ยนพฤติกรรมเสมอไป
ไลเซนส์ปัจจุบัน
- ข้อความลิขสิทธิ์คือ
Copyright 2018-2026 PySimpleGUI. All rights reserved. - ไลเซนส์ปัจจุบันคือ LGPL3
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ที่ทำงานบังคับให้ต้อง บันทึกเวลางานลง Jira แต่ไม่ชอบการต้องเปิดเว็บไซต์ค้างไว้ตลอด และขั้นตอนค้นหาอีชูที่กำลังทำ หาลิงก์บันทึกเวลา และเพิ่มคอมเมนต์ก็ช้ามาก
เลยอยากได้แอปเดสก์ท็อปที่มีรายการอีชูที่ถูกมอบหมายให้ฉัน พร้อมปุ่มเพิ่มคอมเมนต์/บันทึกเวลางาน ตอนแรกเสียเวลาไปมากกับการทำให้หน้าตาออกมาดูดีใน Tkinter แต่หลังจากเจอ PySimpleGUI ก็สามารถต่อกับ Jira API hook แล้วสร้างสิ่งที่ต้องการได้ และมันก็เป็นโปรเจ็กต์ที่ดีสำหรับการเรียนรู้การพัฒนา UI
เพื่อนคนหนึ่งบอกว่าเคยทำไคลเอนต์ Qt ภายในสำหรับงานพื้นฐานใน Jira ที่บริษัทแห่งหนึ่ง และตอนที่ฉันเองต้องใช้ Jira เพื่อติดตามงาน ก็ใช้ https://github.com/go-jira/jira จัดการงานแก้ไขผ่านสคริปต์คอนโซลหลายตัว
เฟรมเวิร์ก GUI แบบนี้น่าตื่นเต้นมาก ประสบการณ์เดสก์ท็อปแบบเนทีฟดีกว่าการประกอบเว็บวิวเยอะ และ event loop แบบเรียบง่ายกับแนวทาง รองรับหลายแบ็กเอนด์ ของ PySimpleGUI ก็ดูใหม่จริง ๆ
แต่ก็สงสัยว่าทำไมถึงไม่มี “GUI อัตโนมัติ” มากกว่านี้ ที่แค่ให้โครงสร้างข้อมูลกับฟังก์ชันมา แล้วมันสร้างอินเทอร์เฟซที่เหมาะสมสำหรับจัดการสิ่งเหล่านั้นให้เอง ถ้าใช้ฮิวริสติกเลือกได้ว่าจะวางพาเนลแนวตั้ง/แนวนอน ใช้แท็บอินเทอร์เฟซหรือป๊อปอัป ก็จะเปิดทางให้ฟีเจอร์จำนวนมากที่ซับซ้อนเกินไปสำหรับ CLI แต่ก็มีความเป็นเนทีฟมากเกินจะทำเป็นเว็บแอป
https://github.com/chriskiehl/Gooey
คุณสามารถนิยาม struct แล้วส่งให้ฟังก์ชัน
dialogจากนั้นมันจะสร้างกล่องโต้ตอบอัตโนมัติตามฟิลด์ของ struct และเมื่อผู้ใช้กด OK ก็จะเรียก callback ได้ นอกจากนี้ยังระบุได้ว่าจะใช้วิดเจ็ตแบบไหนด้วยคุณสมบัติที่ผู้ใช้กำหนดเอง เช่น ถ้าติด@ControlledBy!VerticalSlider(0, 100)ให้กับintมันจะกลายเป็นสไลเดอร์ 0~100 แทนช่องกรอกตัวเลข สำหรับฟังก์ชันเมนูก็สามารถใส่@menu("Search") Find(string text) { ... }เพื่อให้สร้างเมนูและกล่องโต้ตอบอัตโนมัติได้ และยังมีDataControllerWidgetที่เรียก callback ทุกครั้งที่เกิดอีเวนต์การเปลี่ยนแปลง ฉันเคยเขียนโพสต์เกี่ยวกับเรื่องนี้เมื่อหลายปีก่อน แต่ความคืบหน้าช้ามาก: http://dpldocs.info/this-week-in-d/Blog.Posted_2020_11_02.ht...มันน่าสนใจมากจนอยากทุ่มเวลาให้มากกว่านี้ แต่เพราะไม่ได้ใช้กับงานหลัก ก็เลยได้แค่ค่อย ๆ ทำเวลาที่อยากเขียนโค้ดเล่นในวันหยุดสุดสัปดาห์
ตัวอย่างหน้าตาดูเหมือนยกมาจากยุค 90 ตรง ๆ แบบ [0] มันเหมาะมากสำหรับการทำต้นแบบหรือเครื่องมือภายในสำหรับคนที่ใช้ CLI ไม่ได้ แต่ก็สงสัยว่าถ้าต้องการ UI ที่ดูดี จะทำอย่างไร
ในแง่ประสิทธิภาพ UI แบบเนทีฟย่อมดีกว่าเสมอ แต่ฉันรู้สึกมาตลอดว่าการตกแต่งสไตล์ทำได้ยากกว่าเว็บเพจ เลยสงสัยว่าในโลก Python GUI มีอะไรที่เทียบได้กับชุด styled components แบบ Flutter หรือ SwiftUI ที่ทำให้ดูเนี้ยบได้โดยไม่ต้องลงแรงมากบ้าง
[0] https://raw.githubusercontent.com/PySimpleGUI/PySimpleGUI/ma...
อย่างน้อยสไตล์ UI พื้นฐานที่ระบบปฏิบัติการให้มาก็ช่วยให้คนเรียนรู้จากแอปหนึ่งแล้วเอาไปใช้กับอีกแอปหนึ่งได้ และเพราะฉันไม่ใช่นักออกแบบ UI ที่เก่งมาก ค่าเริ่มต้นของระบบปฏิบัติการก็น่าจะดีกว่าสิ่งที่ฉันคิดเองได้อยู่แล้ว ยิ่งพอมีคำพูดจากฝ่ายการตลาดที่ไม่อยากได้ยินอย่าง “ซอฟต์แวร์ของเราดูเก่า” เพิ่มเข้ามา ต้นทุนการพัฒนาก็ยิ่งพุ่งจนรับมือยาก
ยุค 90 ก็มีซอฟต์แวร์แบบนี้อยู่ แต่ไม่ใช่สิ่งที่คนมักหมายถึงเวลาเอ่ยถึงสุนทรียะแบบยุค 90 การออกแบบ UI ของ Windows 95 ผ่านการขัดเกลามาไม่น้อย
ฉันเกลียด UI สมัยนี้ที่เว้นช่องว่างกว้าง ปุ่มไม่เหมือนปุ่ม แถบเลื่อนหายไป และเมนูแฮมเบอร์เกอร์มากกว่า
การแยกฟรอนต์เอนด์กับแบ็กเอนด์ก็ได้มาเป็นพื้นฐานอยู่แล้ว และถ้าภายหลังจำเป็นก็เข้าถึงจากระยะไกลได้ด้วย ถ้าอยากให้ใช้งานเหมือนแอปเนทีฟ ก็ใส่ GUI เล็ก ๆ แบบ Tkinter พร้อมปุ่ม “Open browser UI” ปุ่มเดียวก็ได้ ถ้าปุ่มรันใส่โทเค็นไว้ใน URL ก็ยังช่วยป้องกันจากเดมอนที่รันอยู่โดยผู้ใช้คนอื่นบนเครื่องเดียวกันได้ด้วย แม้ฉันจะยังไม่เคยเห็นที่ไหนทำแบบนี้จริง ๆ
SystemDefaultForRealวิดเจ็ตเนทีฟของ Windows ก็ยังดูทันสมัย แต่ Tkinter ไม่ได้รับการอัปเดตเลย เลยดูขัดตาดูโอเคทีเดียว แต่อาจเปลี่ยนแปลงครั้งใหญ่ได้ยากเพราะไลบรารีนี้ค่อนข้างสมบูรณ์แล้ว อย่างไรก็ตาม น่าจะดีกว่าถ้าใช้ dictionary แทน list เพราะ dictionary ใน Python รุ่นหลัง ๆ จำลำดับการแทรกข้อมูลได้
ที่ทำงานเก่าของผมเคยทำอะไรคล้าย ๆ กันไว้บน PyQt โดยใช้ wrapper ที่บางกว่ามาก และโค้ดก็น้อยจนน่าประหลาดใจ ความต่างหลักคือมันจัดการทั้งการตั้งค่า properties/signals และการซ้อน widget ไปพร้อมกัน แทนที่จะต้องตั้งค่าคุณสมบัติใน constructor อย่างเดียว มันมีข้อดีตรงที่คุณยังตั้งค่าคุณสมบัติในเนื้อหาของ view definition ได้ แม้ว่าภายหลังจะต้องใช้ชื่อ widget เพื่อเปลี่ยนข้อความก็ตาม API ทั้งหมดมีแค่ฟังก์ชัน
setup_viewตัวเดียว และค่อนข้างสะดวกมากเวลาต้องทำ GUI ง่าย ๆ อย่างรวดเร็ว ไลบรารีนี้ก็ดูเป็นทางเลือกที่ดี ขอบคุณที่แชร์https://docs.python.org/3/whatsnew/3.7.html#summary-release-...
ควรปล่อยให้ framework จัดการ data binding ไป ทั้งบนเว็บและเดสก์ท็อปต่างก็ขยับไปในทิศทางนี้เรื่อย ๆ แทนที่จะไปแก้ widget โดยตรง ควร bind properties ของ widget เข้ากับ data store แล้วให้ re-render อัตโนมัติเมื่อมีการเปลี่ยนแปลง ตัวอย่าง input/output ในหน้านั้นก็แสดงแนวคิดคล้ายกัน ตอนนี้ไม่มีใครใช้
getElementById()แล้วดูเหมือนจะเข้าใกล้ความใช้งานง่ายแบบ VB6 หรือ Delphi/Lazarus มากขึ้นเรื่อย ๆ เห็นได้ชัดว่ามีพัฒนาการ และตอนนี้ถ้ามีแค่ interactive GUI builder ก็น่าจะจบแบบสร้างฟอร์มแล้ว
#importมาใช้ได้ทันทีเมื่อหลายปีก่อนผมเคยพยายามใช้ WxPython คู่กับ WxFormBuilder แล้วเสียเวลาไปมหาศาลในโปรเจกต์ แค่เปลี่ยนอะไรเล็กน้อยในฟอร์ม backend ก็พังหมด ถึงจะเขียนโค้ดบาง ๆ สำหรับเชื่อมตรงกลางเอง พอเปลี่ยนชนิดฟิลด์ก็พังอีกทั้งหมด อย่างน้อยที่นี่ก็ดูเหมือนจะไม่เกิดเรื่องแบบนั้น ซึ่งก็น่ายินดี
ในฐานะคนที่พัฒนาแอป GUI ด้วย Python [1] ผมมองว่าปัญหาใหญ่ที่สุดของการใช้ Python กับแอปเดสก์ท็อปคือ การแพ็กเกจ
เครื่องมือแบบเดิมสำหรับสร้างไบนารีที่พร้อมแจกจ่ายมักหยุดทำงานเมื่อมี dependency มากเกินไม่กี่ตัว หรือไม่ก็ต้องใช้การแฮ็กที่ยุ่งยากพอสมควร แม้แต่แพ็กเกจยอดนิยมก็ยังเจอปัญหาชวนงงอย่าง hidden import ที่ตกหล่น หรือไฟล์ข้อมูลที่ไม่รู้ว่าต้องรวมไปด้วย โมดูลที่โหลดแบบไดนามิกก็อาจพังได้เมื่อย้ายออกจากสภาพแวดล้อม Python ปกติไปอยู่ใน PyInstaller หรือ cx_freeze ผมไม่แน่ใจว่าจะทำอะไรได้บ้าง แต่ Python อาจต้องมีมาตรฐานสำหรับการแพ็กโปรแกรมให้รันได้เองโดยอาศัยแค่อินเทอร์พรีเตอร์ คล้ายกับ JAR ของ Java
คุณสามารถใช้เครื่องมืออย่าง shiv หรือ PEX เพื่อสร้าง zipapp ที่รวม dependency ของแอปไว้ได้ แต่ถ้ามี binary extension ผลลัพธ์ก็ยังคงแยกตามแพลตฟอร์มอยู่ดี: https://github.com/linkedin/shiv#gotchas
สำหรับโปรแกรม Python ของผม ผมแนะนำให้ผู้ใช้ติดตั้งผ่าน pipx: https://github.com/pypa/pipx
ถ้าผู้ใช้เป้าหมายมีความเป็นสายเทคนิคนิดหน่อย ผมว่านี่คือทางเลือกที่ดีที่สุด เพราะช่วยเลี่ยงทั้งปัญหา version conflict ของ
pip install --userและความลำบากในการสร้าง virtual environment แยกให้แต่ละแอปด้วยตัวเอง โดยรวมแล้วประสบการณ์ผู้ใช้ก็ค่อนข้างดี ถ้าคุณแนะนำ pipx เป็นวิธีติดตั้งหลัก ก็พอคาดหวังได้ว่าคนส่วนใหญ่จะติดตั้งสำเร็จ โปรแกรมของผมมี dependency แบบไบนารี แต่ไม่มี GUIส่วนตัวแล้วผมชอบ CustomTKinter มากกว่า ดูสง่างามกว่ามาก หน้าตาออกแนว Material theme และรองรับธีมสว่าง/มืดตามการตั้งค่าระบบบน Windows/Linux/macOS
น่าแปลกที่ในสาย การพัฒนาแอปอย่างรวดเร็ว ยังไม่มีอะไรมาเติมช่องว่างที่ VB6 ทิ้งไว้ได้อย่างแท้จริง แม้ตัวภาษาจะไม่ได้ยอดเยี่ยมมาก แต่จุดแข็งของ VB6 คือ GUI builder แบบลากแล้ววาง
https://www.lazarus-ide.org/
https://gambas.sourceforge.net/en/main.html
https://qb64.com/inform.html
ที่มีประโยชน์คือใน pyqt คุณแค่วางไฟล์ layout ไว้ข้าง ๆ สคริปต์ Python ก็ใช้งานได้เลย ฝั่งรองรับ Python ของ IDE ไม่ค่อยดีนัก แต่ก็อาจเป็นเพราะเครื่องติดตั้งของผมพัง
https://xojo.com/
กำลังคิดอยู่ว่าจะครอบเครื่องมือที่มีอินเทอร์เฟซ CLI ซึ่งทำมาได้ค่อนข้างดีด้วย GUI เพื่อให้คนที่ไม่ได้ใช้เดสก์ท็อป Linux ก็ใช้งานได้หรือไม่ ดูเหมือนว่า PySimpleGUI อาจจะตรงกับความต้องการของฉันพอดี
https://github.com/hiAndrewQuinn/finstem
เครื่องมือของฉันมีแฟล็ก CSV, TSV, JSON ที่กำหนดไว้อย่างชัดเจน อยากรู้ว่ามีใครเคยสร้าง GUI ครอบบนเครื่องมือ CLI ที่สมบูรณ์อยู่แล้วโดยไม่ต้องแก้ตัวเครื่องมือเดิมบ้างไหม และควรคาดว่าจะเจอความยากอะไรบ้าง
เอนจินกับ GUI ปฏิบัติตามโปรโตคอลอย่าง WinBoard หรือ UCI[2] และแลกเปลี่ยนคำสั่งข้อความผ่าน STDIN/STDOUT ปัญหาหลักก็เหมือนกับที่เจอในงานมัลติเธรด คืออาจเกิด deadlock ที่ GUI กับ CLI ต่างฝ่ายต่างรอกันจนค้างได้ ดังนั้นทั้งสองฝั่งจึงควรจัดการ I/O ในเธรดที่แยกจาก “business logic” เพื่อคงความตอบสนองไว้ อีกปัญหาที่พบบ่อยคือพฤติกรรมของการจัดการ pipe ต่างกันไปตามระบบปฏิบัติการ จึงต้องระวังเรื่องการ flush บัฟเฟอร์และความต่างของ API ระหว่าง Linux/Mac/Windows
[0] http://hgm.nubati.net/
[1] http://www.playwitharena.de/
[2] https://gist.github.com/DOBRO/2592c6dad754ba67e6dcaec8c90165...
หวังว่าจะไม่ฟังดูเสียมารยาทนะ แต่ข้อความมันเยอะเกินไป มีประโยคยาว ๆ ต่อเนื่องอยู่แทบทุกที่ที่ใส่ข้อความได้ และถึงแม้ส่วนใหญ่จะเขียนอย่างสม่ำเสมอ แต่ในพันคำแรกกลับไม่มีสกรีนช็อตที่เกี่ยวข้องเลยสักภาพ
มันดูเหมือนมีอะไรไม่ค่อยลงตัว อาจจะเป็นนักพัฒนาหนุ่มไฟแรง หรือไม่ก็เหมือนพยายามใส่ข้อความเยอะ ๆ เพื่อโน้มน้าวให้คนลองใช้ README ยังมีส่วน “about me” ที่ผู้เขียนแนะนำตัวเองด้วย ลองเลื่อนลงไปตรงไหนก็ได้ใน README อ่านสักสองสามย่อหน้า แล้วลองเล่าสิ่งที่เพิ่งอ่านดู ก็จะเห็นตัวอย่างเอง
บางคนก็เพลิดเพลินกับการอ่านเรื่องของเครื่องมือเอง มากกว่าจะมีท่าทีแบบ “จะทำยังไงให้ฉันอ่านน้อยที่สุดและเริ่มใช้งานได้เร็วที่สุด” คุณกำลังใช้ฟรีกับเครื่องมือที่คนอื่นทำขึ้นมา ดังนั้นเลิกบ่นแล้วปล่อยให้เขาเขียนในแบบที่เขาต้องการก็น่าจะดีกว่า
[1] https://github.com/PySimpleGUI/PySimpleGUI#about-me-
หวังว่าจะไม่เสียมารยาทนะ แต่ก็อยากถามกลับว่า คุณกำลังกลัวการที่ต้องอ่านอะไรบางอย่างอยู่หรือเปล่า ถ้ามันไม่ได้ถูกย่อยเป็นสรุปทีละขั้นมาป้อนให้
คุณสามารถสื่อความคิดเดียวกันได้ด้วยคำพูดประมาณว่า “ถ้าเป็นโปรเจกต์ที่เน้นภาพ ผมรู้สึกว่าคำอธิบายหลักควรมีสกรีนช็อตมากกว่านี้” โดยไม่ต้องใส่การคาดเดาในเชิงดูหมิ่น
ถ้าใส่คำอย่าง Smart, Open, Trusted, Secure ไว้ในชื่อโปรเจกต์ ผู้คนก็จะชี้ได้ง่ายขึ้นว่ามันไปไม่ถึงอุดมคติที่ชื่อนั้นสื่อไว้ ตรงกันข้าม ชื่ออย่าง C หรือ BSD ไม่มีคำตรงข้ามหรือความหมายแฝงแบบนั้น จึงยากที่จะพูดว่า “ภาษา C ไม่ได้เป็นไปตามชื่อของมัน”