ช่วยเปิด Tkinter บน boot Pi 3
ฉันลองใช้ตัวอย่างในคำถาม Raspberry Pi SEสร้าง systemd ".service" ในอดีตและทำงานได้อย่างไม่มีที่ติ แต่ตอนนี้ฉันใช้ Tkinter กับ python3 บนราสเบอร์รี่ pi3
[Unit] Description=GUI Start
After=graphical.target
Wants=graphical.target
[Service]
User=pi
Group=pi
ExecStart=/bin/bash -c "export DISPLAY=:0; export XAUTHORITY=/home/pi/.Xauthority; /usr/bin/python3 /home/pi/ampolas/ampolas.py"
[Install]
WantedBy=graphical.target
แต่ตอนนี้ฉันได้รับการแสดงผล: 0 ข้อผิดพลาดเช่น:
_tkinter.TclError: couldn't connect to display :0.0
เมื่อฉันเรียกฉันได้รับecho $DISPLAY DISPLAY:0.0แต่ดูเหมือนว่าในการบูตเครื่องจะไม่รู้จัก
เมื่อฉันเรียกใช้ sudo systemctl daemon-reload
แล้ว ... เปิดใช้งาน
แล้ว ... เริ่ม
ทำงานได้ดี แต่ถึงกระนั้นAfter=grafical.targetดูเหมือนว่าDISPLAY:0ยังไม่ได้กำหนด
ฉันไม่คุ้นเคยกับ Linux มากพอที่จะเข้าใจว่าเกิดอะไรขึ้นภายใต้ประทุน
คำตอบ
คุณเขียน:
เมื่อฉันวิ่ง
echo $DISPLAYฉันจะได้รับDISPLAY:0.0
นี่เป็นสิ่งที่ไม่ถูกต้อง คุณต้องได้รับค่าสภาพแวดล้อมเท่านั้น:
rpi ~$ export DISPLAY=:0.0
rpi ~$ echo $DISPLAY
:0.0
rpi ~$ export DISPLAY=DISPLAY:0.0 # WRONG! rpi ~$ echo $DISPLAY
DISPLAY:0.0
โปรดแก้ไขสิ่งนี้ จากนั้นคุณควรกำหนดสภาพแวดล้อมสำหรับบริการไม่ใช่เฉพาะสำหรับเชลล์สคริปต์ ลองสิ่งนี้:
[Unit]
Description=GUI Start
After=graphical.target
Wants=graphical.target
[Service]
User=pi
Group=pi
Environment="DISPLAY=:0.0"
Environment="XAUTHORITY=/home/pi/.Xauthority"
#ExecStartPre=/usr/bin/printenv
ExecStart=/usr/bin/python3 /home/pi/ampolas/ampolas.py
[Install]
WantedBy=graphical.target
หากยังไม่ได้ผลให้ยกเลิกการใส่เครื่องหมาย#ExecStartPre=/usr/bin/printenvเพื่อแสดงสภาพแวดล้อมที่กำหนดไว้ในรันไทม์และมีอะไรผิดปกติ รีบูตและคุณจะพบผลลัพธ์ที่มี:
rpi ~$ journalctl -b
- โอเคฉันจึงใช้งานได้และปรากฎว่าฉันไม่รู้ว่าทำไม เพิ่มบรรทัดนี้:
# Disable bluetooth
dtoverlay=pi3-disable-bt
ไฟล์ config.txt ของฉันคือสิ่งที่ทำให้เกิดข้อผิดพลาด
ฉันคัดลอกตัวอย่างนั้นจากโพสต์นี้:
http://himeshp.blogspot.com/2018/08/fast-boot-with-raspberry-pi.html
และเป็นสิ่งที่ทำให้เกิดข้อผิดพลาดในการแสดงผล ไม่มีเงื่อนงำว่าทำไม แต่ฉันอยากรู้
ฉันใช้เวลา 5 ชั่วโมงในการทำงานในตอนนี้หลังจากลองใช้วิธีแก้ปัญหาอื่น ๆ ทั้งหมดนี้ภายใต้แสงแดดดังนั้นในที่สุดขอให้ฉันได้พักผ่อน
หมายเหตุ: ใช้สำหรับ raspbian โดยมีบัญชีผู้ใช้หลักโดยใช้ชื่อผู้ใช้เริ่มต้น ("pi")
นี่คือขั้นตอนตามลำดับ:
ตั้งชื่อไฟล์ python ของคุณmain.pyแล้วลากไฟล์ python ไปที่เดสก์ท็อป
จากนั้นสร้างไฟล์ข้อความธรรมดาใหม่และเพิ่มเนื้อหาต่อไปนี้:
#!/bin/bash
python3 /home/pi/Desktop/main.py
บันทึกไฟล์ข้อความนี้ไว้launch.commandบนเดสก์ท็อป นี่คือเชลล์สคริปต์เพื่อเปิดไฟล์ python ของคุณ โดยค่าเริ่มต้นจะใช้ไม่ได้เราต้อง chmod (ขั้นตอนต่อไป)
เรียกใช้เทอร์มินัลและรันคำสั่งต่อไปนี้:
chmod u+x /home/pi/Desktop/launch.command
ตอนนี้ดับเบิลคลิกที่ launch.command (และเลือกexecute) จะเปิดไฟล์ python ของคุณ
ณ จุดนี้เราพร้อมที่จะเปิดตัวในการบูต หากคุณได้ดำเนินความพยายามในการเปิดตัวอื่น ๆ ก่อนหน้านี้โปรดยกเลิกทั้งหมดของไฟล์เหล่านั้นเปลี่ยนแปลงที่คุณได้ทำ
เปิดเทอร์มินัลและเรียกใช้สิ่งต่อไปนี้:
sudo nano /etc/systemd/system/myproject.service
เราจะเรียกมันว่า myproject ในตอนนี้อย่าเปลี่ยนแปลงใด ๆ จนกว่าคุณจะใช้งานได้จากนั้นอย่าลังเลที่จะลองเปลี่ยนชื่อ
ในหน้าต่างที่ปรากฏขึ้นให้คัดลอกและวางข้อมูลต่อไปนี้:
[Unit]
Description=Start Myproject
After=graphical.target
Wants=graphical.target
[Service]
User=pi
Group=pi
ExecStart=/bin/bash -c "export DISPLAY=:0; export XAUTHORITY=/home/pi/.Xauthority; /home/pi/Desktop/launch.command"
[Install]
WantedBy=graphical.target
ตอนนี้กด ctrl + x เพื่อออกและบันทึกระบบจะแจ้งให้คุณบันทึกการเปลี่ยนแปลงพิมพ์ "y" ชื่อไฟล์ควรถูกป้อนเป็น ... / myproject.service แล้วหากเป็นเช่นนั้นให้กด Enter และจะบันทึก และออกหากชื่อไฟล์ว่างเปล่ามันจะยุ่ง (สิ่งนี้เกิดขึ้นในบางครั้ง) ให้ออกจากเทอร์มินัลแล้วลองทั้งหมดอีกครั้งขออภัย
ตอนนี้ในเทอร์มินัลให้ป้อน:
sudo systemctl daemon-reload
แล้ว
sudo systemctl enable myproject.service
สุดท้าย
sudo reboot
เมื่อเปิดตัวก่อนที่สิ่งอื่นจะแสดง (หลังจากที่หน้าจอเริ่มต้นเริ่มระบบแสดงขึ้นแน่นอน แต่ก่อนที่เดสก์ท็อปจะแสดง) GUI ของคุณจะเปิดตัวในตอนนี้ขอแสดงความยินดี!
ฉันขอแนะนำให้คุณเปิดใช้งานแบบเต็มหน้าจอเพื่อทำการแก้ไขไฟล์ python ของคุณเพื่อใช้สิ่งนี้:
root.attributes('-fullscreen', True)
หมายเหตุ 'root' ไม่น่าจะเป็นสิ่งที่คุณเรียกว่า TK () init ของคุณ .... ในตอนท้ายของโค้ดของคุณคุณมีบางอย่างเช่นXXXX.mainloop()เปลี่ยน 'root' เป็น XXXX อะไรก็ตามให้ติดสิ่งนี้ทันทีหลังจากที่คุณเริ่มต้นTK()
เมื่อคุณรีบูตแล้วคุณอาจติดอยู่ในแอป (โดยเฉพาะอย่างยิ่งถ้าคุณเปิดใช้งานแบบเต็มหน้าจอ) สิ่งต่างๆเช่น alt + f4 หรือ alt + f11 จะไม่ฆ่าโปรแกรมของคุณ หากต้องการออกให้กดปุ่ม windows / เมนูบนแป้นพิมพ์แผงการเข้าถึงจะปรากฏให้คุณเห็นและสามารถไปที่อุปกรณ์เสริม> เทอร์มินัลเพื่อเปิดหน้าต่างเทอร์มินัลใหม่จากนั้นเรียกใช้สิ่งต่อไปนี้:
sudo systemctl stop myproject.service
โปรแกรมจะถูกฆ่าและคุณจะกลับไปที่เดสก์ท็อปมาตรฐานของคุณ ...
ตอนนี้เพื่อป้องกันไม่ให้เปิดใช้งานอีกครั้งในการบูตเครื่องเพียงแค่เปลี่ยนชื่อlaunch.commandไฟล์ของคุณเป็นDISABLED_launch.commandและเมื่อคุณพร้อมที่จะเริ่มเปิดใช้งานการบูตอีกครั้งให้ตั้งชื่อกลับ
ไปรับเครื่องดื่มคุณได้รับมัน
นอกจากนี้คุณสามารถวางตำแหน่งเหล่านี้ได้อย่างชัดเจนนอกเหนือจากเดสก์ท็อป แต่ตรวจสอบให้แน่ใจว่าคุณใช้เส้นทางแบบเต็มในคำสั่งใด ๆ เหล่านี้เสมออย่าใช้ทางลัด "~ / .. "