4 คะแนน โดย GN⁺ 2023-12-11 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • หลังจากยุติความพยายามเชิงพาณิชย์ 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 ได้โดยตรง:
  • หากต้องการติดตั้งรีลีสเฉพาะจาก GitHub ให้เปลี่ยน master เป็นหมายเลขรีลีส:
  • สามารถ 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 และติดตั้งเวอร์ชันใหม่ได้
  • มีการแก้บั๊ก #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 แล้วใช้งานได้
    • มีข้อมูลและตัวอย่างเพิ่มเติมในรีโพซิทอรีดังกล่าว
  • psgdnd 6.0.1 ถูกปล่อยบน PyPI และทำงานบน Windows
  • เวอร์ชัน 6.0.2 บน GitHub มีการแก้ไขที่จำเป็นสำหรับ Linux
  • สถานะการรองรับ Mac ยังไม่ทราบแน่ชัด
  • รีโพซิทอรี PSGMicroPython ได้เพิ่มโค้ดสำหรับเชื่อมต่อกับไมโครคอนโทรลเลอร์ที่ใช้ MicroPython
    • ทำงานบน Raspberry Pi Pico และ ESP32
    • อาจทำงานบนบอร์ดอื่นได้ด้วย
    • ไม่ได้ตั้งใจให้เป็นโปรเจ็กต์ขนาดใหญ่หรือมีความทนทานสูง แต่แนะนำว่าเป็นโค้ดที่อาจมีประโยชน์

ต้นแบบ PSGWeb

  • PSGWeb เป็นโปรโตไทป์ที่ทำให้ PySimpleGUI ทำงานใน หน้าต่างเบราว์เซอร์
  • มันทำงานได้กับโปรแกรมเดโมส่วนใหญ่
  • สามารถลองรันได้โดยเติม psgweb.us ไว้หน้าที่อยู่ URL ของแอปพลิเคชัน PySimpleGUI บน GitHub
  • 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 ความคิดเห็น

 
GN⁺ 2023-12-11
ความคิดเห็นจาก Hacker News
  • ที่ทำงานบังคับให้ต้อง บันทึกเวลางานลง Jira แต่ไม่ชอบการต้องเปิดเว็บไซต์ค้างไว้ตลอด และขั้นตอนค้นหาอีชูที่กำลังทำ หาลิงก์บันทึกเวลา และเพิ่มคอมเมนต์ก็ช้ามาก
    เลยอยากได้แอปเดสก์ท็อปที่มีรายการอีชูที่ถูกมอบหมายให้ฉัน พร้อมปุ่มเพิ่มคอมเมนต์/บันทึกเวลางาน ตอนแรกเสียเวลาไปมากกับการทำให้หน้าตาออกมาดูดีใน Tkinter แต่หลังจากเจอ PySimpleGUI ก็สามารถต่อกับ Jira API hook แล้วสร้างสิ่งที่ต้องการได้ และมันก็เป็นโปรเจ็กต์ที่ดีสำหรับการเรียนรู้การพัฒนา UI

    • ดูเหมือนว่า Jira จะช้าจนเป็นเรื่องปกติมาก หลายคนเลยพยายามเลี่ยงด้วย เครื่องมือที่ทำขึ้นเอง
      เพื่อนคนหนึ่งบอกว่าเคยทำไคลเอนต์ Qt ภายในสำหรับงานพื้นฐานใน Jira ที่บริษัทแห่งหนึ่ง และตอนที่ฉันเองต้องใช้ Jira เพื่อติดตามงาน ก็ใช้ https://github.com/go-jira/jira จัดการงานแก้ไขผ่านสคริปต์คอนโซลหลายตัว
    • พอที่ทำงานบอกว่าจะเริ่ม บันทึกเวลาใน Jira ฉันก็เริ่มหางานใหม่ทันที
    • สงสัยว่าซอร์สของแอปนี้เปิดเผยไว้ที่ไหนหรือเปล่า สัปดาห์นี้กำลังคิดจะทำอะไรคล้าย ๆ กันอยู่ ถ้ามีแอปที่มีอยู่แล้วแล้วแค่ระบุ Jira instance ได้ก็คงดีมาก
    • ไม่แน่ใจว่านี่นับเป็น การเรียนรู้การพัฒนา UI จริงหรือเปล่า ไม่ค่อยแน่ใจว่ามันจะต่อยอดหรือขยายไปเป็นโปรเจ็กต์ที่ท้าทายกว่านี้ได้แค่ไหน
  • เฟรมเวิร์ก GUI แบบนี้น่าตื่นเต้นมาก ประสบการณ์เดสก์ท็อปแบบเนทีฟดีกว่าการประกอบเว็บวิวเยอะ และ event loop แบบเรียบง่ายกับแนวทาง รองรับหลายแบ็กเอนด์ ของ PySimpleGUI ก็ดูใหม่จริง ๆ
    แต่ก็สงสัยว่าทำไมถึงไม่มี “GUI อัตโนมัติ” มากกว่านี้ ที่แค่ให้โครงสร้างข้อมูลกับฟังก์ชันมา แล้วมันสร้างอินเทอร์เฟซที่เหมาะสมสำหรับจัดการสิ่งเหล่านั้นให้เอง ถ้าใช้ฮิวริสติกเลือกได้ว่าจะวางพาเนลแนวตั้ง/แนวนอน ใช้แท็บอินเทอร์เฟซหรือป๊อปอัป ก็จะเปิดทางให้ฟีเจอร์จำนวนมากที่ซับซ้อนเกินไปสำหรับ CLI แต่ก็มีความเป็นเนทีฟมากเกินจะทำเป็นเว็บแอป

    • โปรเจ็กต์ที่น่าสนใจคือ Gooey ซึ่งบอกว่า “เปลี่ยนโปรแกรมคอนโซล Python 3 แทบทุกตัวให้กลายเป็นแอป GUI ได้ด้วยโค้ดเพียงบรรทัดเดียว”
      https://github.com/chriskiehl/Gooey
    • ในปี 2011 ฉันเคยทำ ตัวสร้างฟอร์มอัตโนมัติ สำหรับเว็บจากอาร์กิวเมนต์ของฟังก์ชัน และเมื่อไม่นานมานี้ก็ลองทำอะไรคล้ายกันเล็กน้อยใน GUI toolkit ที่ใช้ภาษา D
      คุณสามารถนิยาม 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...
      มันน่าสนใจมากจนอยากทุ่มเวลาให้มากกว่านี้ แต่เพราะไม่ได้ใช้กับงานหลัก ก็เลยได้แค่ค่อย ๆ ทำเวลาที่อยากเขียนโค้ดเล่นในวันหยุดสุดสัปดาห์
    • สิ่งที่ตรงกับคำอธิบายนั้นคือแนวคิดชื่อ Naked Objects ซึ่งมีมาตั้งแต่หลายสิบปีก่อน ฉันไม่ได้ลองใช้เพราะไม่ได้สนใจฝั่ง Java แต่ก็ดูมีประโยชน์ดี
    • ในโลก Python มี TraitsUI ที่เคยเป็น “UI อัตโนมัติ” ที่ดี และตอนนี้ก็ยังทำหน้าที่แนวนั้นอยู่
  • ตัวอย่างหน้าตาดูเหมือนยกมาจากยุค 90 ตรง ๆ แบบ [0] มันเหมาะมากสำหรับการทำต้นแบบหรือเครื่องมือภายในสำหรับคนที่ใช้ CLI ไม่ได้ แต่ก็สงสัยว่าถ้าต้องการ UI ที่ดูดี จะทำอย่างไร
    ในแง่ประสิทธิภาพ UI แบบเนทีฟย่อมดีกว่าเสมอ แต่ฉันรู้สึกมาตลอดว่าการตกแต่งสไตล์ทำได้ยากกว่าเว็บเพจ เลยสงสัยว่าในโลก Python GUI มีอะไรที่เทียบได้กับชุด styled components แบบ Flutter หรือ SwiftUI ที่ทำให้ดูเนี้ยบได้โดยไม่ต้องลงแรงมากบ้าง
    [0] https://raw.githubusercontent.com/PySimpleGUI/PySimpleGUI/ma...

    • แม้จะเป็นเรื่องของความเก่งหรือไม่เก่ง แต่จากประสบการณ์ของฉัน UI แบบ “ตกแต่งจัดเต็ม” เป็นหนึ่งในสาเหตุที่ทำให้ซอฟต์แวร์จำนวนมากและประสบการณ์ของผู้ใช้แย่ลง
      อย่างน้อยสไตล์ UI พื้นฐานที่ระบบปฏิบัติการให้มาก็ช่วยให้คนเรียนรู้จากแอปหนึ่งแล้วเอาไปใช้กับอีกแอปหนึ่งได้ และเพราะฉันไม่ใช่นักออกแบบ UI ที่เก่งมาก ค่าเริ่มต้นของระบบปฏิบัติการก็น่าจะดีกว่าสิ่งที่ฉันคิดเองได้อยู่แล้ว ยิ่งพอมีคำพูดจากฝ่ายการตลาดที่ไม่อยากได้ยินอย่าง “ซอฟต์แวร์ของเราดูเก่า” เพิ่มเข้ามา ต้นทุนการพัฒนาก็ยิ่งพุ่งจนรับมือยาก
    • กลิ่นอายยุค 90 เองไม่ใช่ปัญหา แต่แบบนี้ก็ยังไม่ตรงกับลุคของระบบปฏิบัติการยุค 90 ด้วยซ้ำ พื้นหลังของเช็กบ็อกซ์ผิด ป้ายชื่อด้านบนก็ไม่ตรงแนว ตำแหน่งปุ่ม Exit ก็แปลก ทำให้โดยรวมดูเป็น UI ที่ออกแบบไม่ดี
      ยุค 90 ก็มีซอฟต์แวร์แบบนี้อยู่ แต่ไม่ใช่สิ่งที่คนมักหมายถึงเวลาเอ่ยถึงสุนทรียะแบบยุค 90 การออกแบบ UI ของ Windows 95 ผ่านการขัดเกลามาไม่น้อย
    • ไม่เข้าใจว่าลุคยุค 90 มีปัญหาอะไร หลายคนก็ชอบมัน
      ฉันเกลียด UI สมัยนี้ที่เว้นช่องว่างกว้าง ปุ่มไม่เหมือนปุ่ม แถบเลื่อนหายไป และเมนูแฮมเบอร์เกอร์มากกว่า
    • ถ้าให้ความสำคัญกับรูปลักษณ์เป็นอันดับแรก ก็ดูเหมือนจะสู้ เว็บเพจ ได้ยากมาก
      การแยกฟรอนต์เอนด์กับแบ็กเอนด์ก็ได้มาเป็นพื้นฐานอยู่แล้ว และถ้าภายหลังจำเป็นก็เข้าถึงจากระยะไกลได้ด้วย ถ้าอยากให้ใช้งานเหมือนแอปเนทีฟ ก็ใส่ GUI เล็ก ๆ แบบ Tkinter พร้อมปุ่ม “Open browser UI” ปุ่มเดียวก็ได้ ถ้าปุ่มรันใส่โทเค็นไว้ใน URL ก็ยังช่วยป้องกันจากเดมอนที่รันอยู่โดยผู้ใช้คนอื่นบนเครื่องเดียวกันได้ด้วย แม้ฉันจะยังไม่เคยเห็นที่ไหนทำแบบนี้จริง ๆ
    • ปัญหาคืออย่างน้อยบน Windows นั้น Tkinter ใช้ วิดเจ็ตยุค 90 อย่างชัดเจน ต่อให้เปลี่ยนธีม PySimpleGUI เป็น SystemDefaultForReal วิดเจ็ตเนทีฟของ Windows ก็ยังดูทันสมัย แต่ Tkinter ไม่ได้รับการอัปเดตเลย เลยดูขัดตา
  • ดูโอเคทีเดียว แต่อาจเปลี่ยนแปลงครั้งใหญ่ได้ยากเพราะไลบรารีนี้ค่อนข้างสมบูรณ์แล้ว อย่างไรก็ตาม น่าจะดีกว่าถ้าใช้ dictionary แทน list เพราะ dictionary ใน Python รุ่นหลัง ๆ จำลำดับการแทรกข้อมูลได้
    ที่ทำงานเก่าของผมเคยทำอะไรคล้าย ๆ กันไว้บน PyQt โดยใช้ wrapper ที่บางกว่ามาก และโค้ดก็น้อยจนน่าประหลาดใจ ความต่างหลักคือมันจัดการทั้งการตั้งค่า properties/signals และการซ้อน widget ไปพร้อมกัน แทนที่จะต้องตั้งค่าคุณสมบัติใน constructor อย่างเดียว มันมีข้อดีตรงที่คุณยังตั้งค่าคุณสมบัติในเนื้อหาของ view definition ได้ แม้ว่าภายหลังจะต้องใช้ชื่อ widget เพื่อเปลี่ยนข้อความก็ตาม API ทั้งหมดมีแค่ฟังก์ชัน setup_view ตัวเดียว และค่อนข้างสะดวกมากเวลาต้องทำ GUI ง่าย ๆ อย่างรวดเร็ว ไลบรารีนี้ก็ดูเป็นทางเลือกที่ดี ขอบคุณที่แชร์

    • การเปลี่ยนแปลงนั้นเข้ามาใน Python 3.7 และตอนนี้ก็เป็นฟีเจอร์ที่มีมาแล้ว เกิน 5 ปี
      https://docs.python.org/3/whatsnew/3.7.html#summary-release-...
    • ถ้าดูแนวโน้มของ GUI framework ช่วงหลัง ๆ จะเห็นว่า การแยก layout ออกจากข้อมูล ทำให้โค้ดสะอาดกว่ามาก
      ควรปล่อยให้ framework จัดการ data binding ไป ทั้งบนเว็บและเดสก์ท็อปต่างก็ขยับไปในทิศทางนี้เรื่อย ๆ แทนที่จะไปแก้ widget โดยตรง ควร bind properties ของ widget เข้ากับ data store แล้วให้ re-render อัตโนมัติเมื่อมีการเปลี่ยนแปลง ตัวอย่าง input/output ในหน้านั้นก็แสดงแนวคิดคล้ายกัน ตอนนี้ไม่มีใครใช้ getElementById() แล้ว
    • ตามหน้า GitHub ระบุว่า “ทำให้การนิยามหน้าต่างง่ายขึ้นด้วย list และ dictionary ซึ่งเป็นชนิดข้อมูลหลักของ Python ที่ผู้เริ่มต้นเข้าใจได้”
  • ดูเหมือนจะเข้าใกล้ความใช้งานง่ายแบบ VB6 หรือ Delphi/Lazarus มากขึ้นเรื่อย ๆ เห็นได้ชัดว่ามีพัฒนาการ และตอนนี้ถ้ามีแค่ interactive GUI builder ก็น่าจะจบแบบสร้างฟอร์มแล้ว #import มาใช้ได้ทันที
    เมื่อหลายปีก่อนผมเคยพยายามใช้ WxPython คู่กับ WxFormBuilder แล้วเสียเวลาไปมหาศาลในโปรเจกต์ แค่เปลี่ยนอะไรเล็กน้อยในฟอร์ม backend ก็พังหมด ถึงจะเขียนโค้ดบาง ๆ สำหรับเชื่อมตรงกลางเอง พอเปลี่ยนชนิดฟิลด์ก็พังอีกทั้งหมด อย่างน้อยที่นี่ก็ดูเหมือนจะไม่เกิดเรื่องแบบนั้น ซึ่งก็น่ายินดี

  • ในฐานะคนที่พัฒนาแอป GUI ด้วย Python [1] ผมมองว่าปัญหาใหญ่ที่สุดของการใช้ Python กับแอปเดสก์ท็อปคือ การแพ็กเกจ
    เครื่องมือแบบเดิมสำหรับสร้างไบนารีที่พร้อมแจกจ่ายมักหยุดทำงานเมื่อมี dependency มากเกินไม่กี่ตัว หรือไม่ก็ต้องใช้การแฮ็กที่ยุ่งยากพอสมควร แม้แต่แพ็กเกจยอดนิยมก็ยังเจอปัญหาชวนงงอย่าง hidden import ที่ตกหล่น หรือไฟล์ข้อมูลที่ไม่รู้ว่าต้องรวมไปด้วย โมดูลที่โหลดแบบไดนามิกก็อาจพังได้เมื่อย้ายออกจากสภาพแวดล้อม Python ปกติไปอยู่ใน PyInstaller หรือ cx_freeze ผมไม่แน่ใจว่าจะทำอะไรได้บ้าง แต่ Python อาจต้องมีมาตรฐานสำหรับการแพ็กโปรแกรมให้รันได้เองโดยอาศัยแค่อินเทอร์พรีเตอร์ คล้ายกับ JAR ของ Java

    1. https://github.com/FreeLanguageTools/vocabsieve
    • Python มี zipapp ซึ่งเป็นมาตรฐานและคล้าย JAR อยู่แล้ว: https://peps.python.org/pep-0441/
      คุณสามารถใช้เครื่องมืออย่าง 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 แบบลากแล้ววาง

    • อย่างที่คนอื่นพูดไว้ Lazarus ก็น่าพิจารณา และถ้าอยากได้ประสบการณ์แบบ VB มากขึ้น Gambas ก็อาจน่าสนใจ
      https://www.lazarus-ide.org/
      https://gambas.sourceforge.net/en/main.html
    • เป็น paradigm เดียวกันคือเก็บ UI ไว้ในไฟล์ที่แก้ไขด้วยมือได้
      https://qb64.com/inform.html
    • https://www.lazarus-ide.org/
    • ผมใช้ qtcreator นานกว่าที่ตั้งใจไว้มากเพราะ การออกแบบ UI แบบลากแล้ววาง
      ที่มีประโยชน์คือใน pyqt คุณแค่วางไฟล์ layout ไว้ข้าง ๆ สคริปต์ Python ก็ใช้งานได้เลย ฝั่งรองรับ Python ของ IDE ไม่ค่อยดีนัก แต่ก็อาจเป็นเพราะเครื่องติดตั้งของผมพัง
    • Xojo คือทายาททางจิตวิญญาณของ VB6 อย่างแท้จริง
      https://xojo.com/
  • กำลังคิดอยู่ว่าจะครอบเครื่องมือที่มีอินเทอร์เฟซ CLI ซึ่งทำมาได้ค่อนข้างดีด้วย GUI เพื่อให้คนที่ไม่ได้ใช้เดสก์ท็อป Linux ก็ใช้งานได้หรือไม่ ดูเหมือนว่า PySimpleGUI อาจจะตรงกับความต้องการของฉันพอดี
    https://github.com/hiAndrewQuinn/finstem
    เครื่องมือของฉันมีแฟล็ก CSV, TSV, JSON ที่กำหนดไว้อย่างชัดเจน อยากรู้ว่ามีใครเคยสร้าง GUI ครอบบนเครื่องมือ CLI ที่สมบูรณ์อยู่แล้วโดยไม่ต้องแก้ตัวเครื่องมือเดิมบ้างไหม และควรคาดว่าจะเจอความยากอะไรบ้าง

    • เอนจินหมากรุก เป็นกรณีอ้างอิงที่ดี ส่วนการตัดสินใจเป็น CLI และเชื่อมต่อกับ GUI อย่าง WinBoard[0] หรือ Arena[1]
      เอนจินกับ 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...
    • ตัวอย่างเช่น HandBrake ก็ได้ มันใกล้เคียงกับการเป็น UI ที่ดูสวยสำหรับ ffmpeg
  • หวังว่าจะไม่ฟังดูเสียมารยาทนะ แต่ข้อความมันเยอะเกินไป มีประโยคยาว ๆ ต่อเนื่องอยู่แทบทุกที่ที่ใส่ข้อความได้ และถึงแม้ส่วนใหญ่จะเขียนอย่างสม่ำเสมอ แต่ในพันคำแรกกลับไม่มีสกรีนช็อตที่เกี่ยวข้องเลยสักภาพ
    มันดูเหมือนมีอะไรไม่ค่อยลงตัว อาจจะเป็นนักพัฒนาหนุ่มไฟแรง หรือไม่ก็เหมือนพยายามใส่ข้อความเยอะ ๆ เพื่อโน้มน้าวให้คนลองใช้ README ยังมีส่วน “about me” ที่ผู้เขียนแนะนำตัวเองด้วย ลองเลื่อนลงไปตรงไหนก็ได้ใน README อ่านสักสองสามย่อหน้า แล้วลองเล่าสิ่งที่เพิ่งอ่านดู ก็จะเห็นตัวอย่างเอง

    • แต่ละส่วนมีหัวข้อชัดเจน ถ้าเป็นส่วนที่ไม่สนใจก็แค่เลื่อนผ่านอีกนิดหน่อย ไม่มีใครบังคับให้อ่านส่วน “about me”
      บางคนก็เพลิดเพลินกับการอ่านเรื่องของเครื่องมือเอง มากกว่าจะมีท่าทีแบบ “จะทำยังไงให้ฉันอ่านน้อยที่สุดและเริ่มใช้งานได้เร็วที่สุด” คุณกำลังใช้ฟรีกับเครื่องมือที่คนอื่นทำขึ้นมา ดังนั้นเลิกบ่นแล้วปล่อยให้เขาเขียนในแบบที่เขาต้องการก็น่าจะดีกว่า
    • การคาดเดาว่าเป็น “นักพัฒนาหนุ่มไฟแรง” นั้นไม่ถูกต้อง “About Me” [1] บอกไว้ว่าเขา เขียนซอฟต์แวร์มาตั้งแต่ยุค 70s และใช้เวลาส่วนใหญ่ของอาชีพไปกับการสร้างผลิตภัณฑ์ใน Silicon Valley
      [1] https://github.com/PySimpleGUI/PySimpleGUI#about-me-
    • ฉันแค่กวาดตาดูผ่าน ๆ มันเป็น เครื่องมือ ที่คนสร้างเขียนเอกสารเอง ไม่ใช่ MVP ของผลิตภัณฑ์ที่ทำมาเพื่อดึงดูดนักลงทุน
      หวังว่าจะไม่เสียมารยาทนะ แต่ก็อยากถามกลับว่า คุณกำลังกลัวการที่ต้องอ่านอะไรบางอย่างอยู่หรือเปล่า ถ้ามันไม่ได้ถูกย่อยเป็นสรุปทีละขั้นมาป้อนให้
    • ผมมองว่านั่นเป็นคำพูดที่ค่อนข้างเสียมารยาท โดยเฉพาะเมื่อคุณลดเหตุผลที่ข้อความเยอะลงเหลือแค่สองอย่าง และทั้งสองอย่างก็ฟังดูไม่ค่อยดีเท่าไร แถมดูเหมือนจะไม่ใช่เหตุผลที่ถูกต้องด้วย
      คุณสามารถสื่อความคิดเดียวกันได้ด้วยคำพูดประมาณว่า “ถ้าเป็นโปรเจกต์ที่เน้นภาพ ผมรู้สึกว่าคำอธิบายหลักควรมีสกรีนช็อตมากกว่านี้” โดยไม่ต้องใส่การคาดเดาในเชิงดูหมิ่น
    • ปัญหาอาจอยู่ที่การตั้งชื่อโปรเจกต์ว่า Simple เพราะมันปลูกฝังความคาดหวังบางอย่างไว้ในหัวผู้อ่าน
      ถ้าใส่คำอย่าง Smart, Open, Trusted, Secure ไว้ในชื่อโปรเจกต์ ผู้คนก็จะชี้ได้ง่ายขึ้นว่ามันไปไม่ถึงอุดมคติที่ชื่อนั้นสื่อไว้ ตรงกันข้าม ชื่ออย่าง C หรือ BSD ไม่มีคำตรงข้ามหรือความหมายแฝงแบบนั้น จึงยากที่จะพูดว่า “ภาษา C ไม่ได้เป็นไปตามชื่อของมัน”