ช่วยเปิด Tkinter บน boot Pi 3

Sep 19 2020

ฉันลองใช้ตัวอย่างในคำถาม 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 มากพอที่จะเข้าใจว่าเกิดอะไรขึ้นภายใต้ประทุน

คำตอบ

1 Ingo Sep 19 2020 at 00:35

คุณเขียน:

เมื่อฉันวิ่ง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
1 arnaldolacerda Sep 21 2020 at 10:28
  1. โอเคฉันจึงใช้งานได้และปรากฎว่าฉันไม่รู้ว่าทำไม เพิ่มบรรทัดนี้:
# Disable bluetooth
dtoverlay=pi3-disable-bt

ไฟล์ config.txt ของฉันคือสิ่งที่ทำให้เกิดข้อผิดพลาด

ฉันคัดลอกตัวอย่างนั้นจากโพสต์นี้:

http://himeshp.blogspot.com/2018/08/fast-boot-with-raspberry-pi.html

และเป็นสิ่งที่ทำให้เกิดข้อผิดพลาดในการแสดงผล ไม่มีเงื่อนงำว่าทำไม แต่ฉันอยากรู้

AlbertRenshaw Dec 05 2020 at 17:45

ฉันใช้เวลา 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และเมื่อคุณพร้อมที่จะเริ่มเปิดใช้งานการบูตอีกครั้งให้ตั้งชื่อกลับ


ไปรับเครื่องดื่มคุณได้รับมัน

นอกจากนี้คุณสามารถวางตำแหน่งเหล่านี้ได้อย่างชัดเจนนอกเหนือจากเดสก์ท็อป แต่ตรวจสอบให้แน่ใจว่าคุณใช้เส้นทางแบบเต็มในคำสั่งใด ๆ เหล่านี้เสมออย่าใช้ทางลัด "~ / .. "