【问题标题】:How do I to show text in python window with gtk如何使用 gtk 在 python 窗口中显示文本
【发布时间】:2023-03-22 19:47:01
【问题描述】:

我在 python 中有一个小应用程序,可以禁用或启用从相机到 debian 操作系统的内核模块。程序运行良好,但现在我想用 GTK 更改 tkinter。我用 glade 制作了一个新的 gui,现在我有了在 GTK 中运行的新 Python 应用程序。除画布外,程序运行良好。带有 tkinter 的旧程序显示“相机已加载”或“相机未加载”。我想对 gtk 做同样的事情,但我不知道该怎么做才能显示相同的文本。我从 pdf 或 youtube 视频中阅读了很多示例,但没有找到任何解决方案。

感谢您的帮助!

谢谢

Python 与 Tkinter

#!/usr/bin/python3
import os
import subprocess
from subprocess import call
from tkinter import *
from tkinter.filedialog import askopenfilename

script = '''
#!/bin/bash
set -x
set -o errexit
set -o nounset
#set -o pipefail

user=derek     

case "$1" in 
    enable_cam)
    #Enable camera!
    if lsusb | grep "Webcam C270" > /dev/null; then
        echo "Webcam is plug in"
        if find /etc/modprobe.d/camera.conf 2>/dev/null ; then
            rm /etc/modprobe.d/camera.conf
        else 
            echo "There is no file camera.conf"
        fi
        depmod -ae
        id=$(lsusb | grep "Webcam C270" | cut -c 24-27)
        echo "$id"
        cd /sys/bus/usb/devices/    
        grep $id */idVendor 
        directory=$(grep $id */idVendor | cut -c 1-3)
        echo $directory
        cd $directory
        sudo sh -c "echo 1 > /sys/bus/usb/devices/$directory/authorized"
        modprobe uvcvideo
        notify-send "Camera is ON"
        env -u SUDO_GID -u SUDO_COMMAND -u SUDO_USER -u SUDO_UID beep -l 200
    else
        echo "Camera isn't plug in"
    fi      
    ;;

    enable_mic)
    #Enable microphone!
    if lsusb | grep "Webcam C270" > /dev/null; then
        echo "Microphone is plug in"
        if find /etc/modprobe.d/microphone.conf 2>/dev/null ; then
            rm /etc/modprobe.d/microphone.conf
        else 
            echo "There is no file microphone.conf"
        fi
        depmod -ae
        id=$(lsusb | grep "Webcam C270" | cut -c 24-27)
        echo "$id"
        cd /sys/bus/usb/devices/    
        grep $id */idVendor 
        directory=$(grep $id */idVendor | cut -c 1-3)
        echo $directory
        cd $directory
        sudo sh -c "echo 1 > /sys/bus/usb/devices/$directory/authorized"
        modprobe snd_usb_audio
        notify-send "Microphone is ON"
        env -u SUDO_GID -u SUDO_COMMAND -u SUDO_USER -u SUDO_UID beep -l 200
    else
        echo "Microphone isn't plug in"
    fi
    ;;

    disable_cam)
    #Disable camera
    if lsusb | grep "Webcam C270" > /dev/null; then
        echo "Camera is plug in"
        sh -c "echo 'blacklist uvcvideo' > /etc/modprobe.d/camera.conf"
        sh -c "echo 'install uvcvideo /bin/true' >> /etc/modprobe.d/camera.conf"
        depmod -ae
        id=$(lsusb | grep "Webcam C270" | cut -c 24-27)
        echo "$id"
        cd /sys/bus/usb/devices/    
        grep $id */idVendor 
        directory=$(grep $id */idVendor | cut -c 1-3)
        echo "$directory"
        cd $directory
        #sudo sh -c "echo 0 > /sys/bus/usb/devices/$directory/authorized"
        modprobe -r uvcvideo
        notify-send "Camera is OFF"
        env -u SUDO_GID -u SUDO_COMMAND -u SUDO_USER -u SUDO_UID beep -l 20
    else
        echo "Camera isn't plug in"
    fi  
    ;;

    disable_mic)
    #Disable microphone!
    if lsusb | grep "Webcam C270" > /dev/null; then
        echo "Microphone is plug in"
        sh -c "echo 'blacklist snd_usb_audio' > /etc/modprobe.d/microphone.conf"
        sh -c "echo 'install snd_usb_audio /bin/true' >> /etc/modprobe.d/microphone.conf"
        depmod -ae
        id=$(lsusb | grep "Webcam C270" | cut -c 24-27)
        echo "$id"
        cd /sys/bus/usb/devices/    
        grep $id */idVendor 
        directory=$(grep $id */idVendor | cut -c 1-3)
        echo "$directory"
        cd $directory
        sudo sh -c "echo 0 > /sys/bus/usb/devices/$directory/authorized"
        modprobe -r snd_usb_audio
        sudo sh -c "echo 1 > /sys/bus/usb/devices/$directory/authorized"
        notify-send "Microphone is OFF"
        env -u SUDO_GID -u SUDO_COMMAND -u SUDO_USER -u SUDO_UID beep -l 20
    else
        echo "Microphone isn't plug in"
    fi  
    ;;

    *)
    clear
    echo "Usage: $0 {enable_cam|disable_cam|enable_mic|disable_mic}"
        
esac
'''

root = Tk()
root.title('Camera - Microphone')
root.geometry("330x240")

var1 = StringVar()
exit_code_cam = os.system("lsmod |grep uvcvideo")
load = "Camera is loaded"
notLoad = "Camera not loaded"

if exit_code_cam == 0:
    l1 = Label(root, textvariable=var1, fg="green")
    l1.place(x=2, y=10)
    var1.set(load)
else:
    l1 = Label(root, textvariable=var1, fg="red")
    l1.place(x=2, y=10)
    var1.set(notLoad)

var2 = StringVar()
exit_code_mic = os.system("lsmod |grep snd_usb_audio")
load = "Microphone is loaded"
notLoad = "Microphone not loaded"

if exit_code_mic == 0:
    l2 = Label(root, textvariable=var2, fg="green")
    l2.place(x=168, y=10)
    var2.set(load)
else:
    l2 = Label(root, textvariable=var2, fg="red")
    l2.place(x=168, y=10)
    var2.set(notLoad)

def NewFile():
    print("New File!")

def OpenFile():
    name = askopenfilename()
    print(name)

def About():
    print("This simple program written.")

menu = Menu(root)
root.config(menu=menu)
filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=NewFile)
filemenu.add_command(label="Open...", command=OpenFile)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)

helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About...", command=About)

def button_add1():
    subprocess.run(["pkexec", 'sh', '-c', script, "_", "enable_cam"], check=True)

def button_add2():
    subprocess.run(["pkexec", 'sh', '-c', script, "_", "enable_mic"], check=True)
    call(["amixer", "set", "Capture", "cap"])
    call(["amixer", "set", "Capture", "25%"])

def button_add3():
    subprocess.run(["pkexec", 'sh', '-c', script, "_", "disable_cam"], check=True)

def button_add4():
    subprocess.run(["pkexec", 'sh', '-c', script, "_", "disable_mic"], check=True)

# Define Buttons
button_1 = Button(root, text="Allow camera", width=20, height=5, padx=0, pady=0, command=button_add1)
button_2 = Button(root, text="Allow microphone", width=20, height=5, padx=0, pady=0, command=button_add2)
button_3 = Button(root, text="Block camera", width=20, height=5, padx=0, pady=0, command=button_add3)
button_4 = Button(root, text="Block microphone", width=20, height=5, padx=0, pady=0, command=button_add4)

# Put the buttons on the screen
button_1.place(x=0, y=75)
button_2.place(x=165, y=75)
button_3.place(x=0, y=150)
button_4.place(x=165, y=150)

root.mainloop()

Python 与 GTK

#!/usr/bin/python3
# ^ this needs to be the absolutely first line of the file
import os
import subprocess
import gi
import sys
sys.path.insert(1, '/usr/share/firewall/firewall/')


gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

script = '''
#!/bin/bash
set -x
set -o errexit
set -o nounset
#set -o pipefail

user=derek  

case "$1" in 
    enable_cam)
    #Enable camera!
    if lsusb | grep "Webcam C270" > /dev/null; then
        echo "Webcam is plug in"
        if find /etc/modprobe.d/camera.conf 2>/dev/null ; then
            rm /etc/modprobe.d/camera.conf
        else 
            echo "There is no file camera.conf"
        fi
        depmod -ae
        id=$(lsusb | grep "Webcam C270" | cut -c 24-27)
        echo "$id"
        cd /sys/bus/usb/devices/    
        grep $id */idVendor 
        directory=$(grep $id */idVendor | cut -c 1-3)
        echo $directory
        cd $directory
        sudo sh -c "echo 1 > /sys/bus/usb/devices/$directory/authorized"
        modprobe uvcvideo
        notify-send "Camera is ON"
        env -u SUDO_GID -u SUDO_COMMAND -u SUDO_USER -u SUDO_UID beep -l 200
    else
        echo "Camera isn't plug in"
    fi      
    ;;

    enable_mic)
    #Enable microphone!
    if lsusb | grep "Webcam C270" > /dev/null; then
        echo "Microphone is plug in"
        if find /etc/modprobe.d/microphone.conf 2>/dev/null ; then
            rm /etc/modprobe.d/microphone.conf
        else 
            echo "There is no file microphone.conf"
        fi
        depmod -ae
        id=$(lsusb | grep "Webcam C270" | cut -c 24-27)
        echo "$id"
        cd /sys/bus/usb/devices/    
        grep $id */idVendor 
        directory=$(grep $id */idVendor | cut -c 1-3)
        echo $directory
        cd $directory
        sudo sh -c "echo 1 > /sys/bus/usb/devices/$directory/authorized"
        modprobe snd_usb_audio
        notify-send "Microphone is ON"
        env -u SUDO_GID -u SUDO_COMMAND -u SUDO_USER -u SUDO_UID beep -l 200
    else
        echo "Microphone isn't plug in"
    fi
    ;;

    disable_cam)
    #Disable camera
    if lsusb | grep "Webcam C270" > /dev/null; then
        echo "Camera is plug in"
        sh -c "echo 'blacklist uvcvideo' > /etc/modprobe.d/camera.conf"
        sh -c "echo 'install uvcvideo /bin/true' >> /etc/modprobe.d/camera.conf"
        depmod -ae
        id=$(lsusb | grep "Webcam C270" | cut -c 24-27)
        echo "$id"
        cd /sys/bus/usb/devices/    
        grep $id */idVendor 
        directory=$(grep $id */idVendor | cut -c 1-3)
        echo "$directory"
        cd $directory
        #sudo sh -c "echo 0 > /sys/bus/usb/devices/$directory/authorized"
        modprobe -r uvcvideo
        notify-send "Camera is OFF"
        env -u SUDO_GID -u SUDO_COMMAND -u SUDO_USER -u SUDO_UID beep -l 20
    else
        echo "Camera isn't plug in"
    fi  
    ;;

    disable_mic)
    #Disable microphone!
    if lsusb | grep "Webcam C270" > /dev/null; then
        echo "Microphone is plug in"
        sh -c "echo 'blacklist snd_usb_audio' > /etc/modprobe.d/microphone.conf"
        sh -c "echo 'install snd_usb_audio /bin/true' >> /etc/modprobe.d/microphone.conf"
        depmod -ae
        id=$(lsusb | grep "Webcam C270" | cut -c 24-27)
        echo "$id"
        cd /sys/bus/usb/devices/    
        grep $id */idVendor 
        directory=$(grep $id */idVendor | cut -c 1-3)
        echo "$directory"
        cd $directory
        sudo sh -c "echo 0 > /sys/bus/usb/devices/$directory/authorized"
        modprobe -r snd_usb_audio
        sudo sh -c "echo 1 > /sys/bus/usb/devices/$directory/authorized"
        notify-send "Microphone is OFF"
        env -u SUDO_GID -u SUDO_COMMAND -u SUDO_USER -u SUDO_UID beep -l 20
    else
        echo "Microphone isn't plug in"
    fi  
    ;;

    *)
    clear
    echo "Usage: $0 {enable_cam|disable_cam|enable_mic|disable_mic}"

esac
'''


class main_window:

    def __init__(self):

        # Get GUI from Glade file
        #used Only for debugging (pycharm)
        self.gladefile = "cam-mic_test.glade"
        #self.gladefile = "/usr/share/firewall/firewall/firewall.glade"
        self.builder   = Gtk.Builder()
        self.builder.add_from_file(self.gladefile)

        # Connect the signals
        self.builder.connect_signals(self)

        # Load the main window and display it on the screen
        self.main_window  = self.builder.get_object("main_window")
        self.about_dialog = self.builder.get_object("about_dialog")
        self.main_window.show()

    def on_camera_show_activate_current_link(self, object, data=None):
        #HERE I DON"T KNOW WHAT I HAVE TO DO

    # Enable camera
    def on_enable_cam_button_clicked(self, object, data=None):
        print("enable camera")
        subprocess.run(["pkexec", 'sh', '-c', script, "_", "enable_cam"], check=True)

    # Disable camera
    def on_disable_camera_button_clicked(self, object, data=None):
        print("disable camera")
        subprocess.run(["pkexec", 'sh', '-c', script, "_", "disable_cam"], check=True)

    # Enable microphone
    def on_enable_microphone_button_clicked(self, object, data=None):
        subprocess.run(["pkexec", 'sh', '-c', script, "_", "enable_mic"], check=True)
        subprocess.run(["amixer", "set", "Capture", "cap"])
        subprocess.run(["amixer", "set", "Capture", "30%"])

    # Disable microphone
    def on_disable_microphone_button_clicked(self, object, data=None):
        print("Disable microphone")
        subprocess.run(["pkexec", 'sh', '-c', script, "_", "disable_mic"], check=True)

    # The clicked on the window's destroy button
    def on_main_window_destroy(self, object, data=None):
        print("quit with cancel")
        Gtk.main_quit()

    # The clicked on file/quit from the menu
    def on_file_quit_activate(self, menuitem, data=None):
        print("quit from menu")
        Gtk.main_quit()

    def on_menu_about_activate(self, menuitem, data=None):
        print("help about selected")
        self.response = self.about_dialog.run()
        self.about_dialog.hide()

# If this is run as a stand alone program, create the
# main window and it off to GTK for processing.
# Otherwise, just define the class.
if __name__ == '__main__':
    main = main_window()
    Gtk.main()

林间空地文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkAboutDialog" id="about_dialog">
    <property name="can_focus">False</property>
    <property name="type_hint">dialog</property>
    <property name="program_name">Enable or disable camera and microphone</property>
    <property name="version">version 0.1.1</property>
    <property name="logo_icon_name">help-about</property>
    <child>
      <placeholder/>
    </child>
    <child internal-child="vbox">
      <object class="GtkBox">
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <property name="spacing">2</property>
        <child internal-child="action_area">
          <object class="GtkButtonBox">
            <property name="can_focus">False</property>
            <property name="layout_style">end</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">False</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <placeholder/>
        </child>
      </object>
    </child>
  </object>
  <object class="GtkWindow" id="main_window">
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">Camera and microphone</property>
    <property name="default_width">640</property>
    <property name="default_height">480</property>
    <signal name="destroy" handler="on_main_window_destroy" swapped="no"/>
    <child>
      <placeholder/>
    </child>
    <child>
      <object class="GtkFixed">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkMenuBar">
            <property name="width_request">429</property>
            <property name="height_request">0</property>
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <object class="GtkMenuItem">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">_File</property>
                <property name="use_underline">True</property>
                <child type="submenu">
                  <object class="GtkMenu">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-new</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-open</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-save</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-save-as</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkSeparatorMenuItem">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem" id="file_quit">
                        <property name="label">gtk-quit</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                        <signal name="activate" handler="on_file_quit_activate" swapped="no"/>
                      </object>
                    </child>
                  </object>
                </child>
              </object>
            </child>
            <child>
              <object class="GtkMenuItem">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">_Edit</property>
                <property name="use_underline">True</property>
                <child type="submenu">
                  <object class="GtkMenu">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-cut</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-copy</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-paste</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkImageMenuItem">
                        <property name="label">gtk-delete</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                      </object>
                    </child>
                  </object>
                </child>
              </object>
            </child>
            <child>
              <object class="GtkMenuItem">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">_View</property>
                <property name="use_underline">True</property>
              </object>
            </child>
            <child>
              <object class="GtkMenuItem">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="label" translatable="yes">_Help</property>
                <property name="use_underline">True</property>
                <child type="submenu">
                  <object class="GtkMenu">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <child>
                      <object class="GtkImageMenuItem" id="menu_about">
                        <property name="label">gtk-about</property>
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_underline">True</property>
                        <property name="use_stock">True</property>
                        <signal name="activate" handler="on_menu_about_activate" swapped="no"/>
                      </object>
                    </child>
                  </object>
                </child>
              </object>
            </child>
          </object>
        </child>
        <child>
          <object class="GtkButton" id="enable_cam_button">
            <property name="label" translatable="yes">Enable camera</property>
            <property name="width_request">0</property>
            <property name="height_request">0</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="on_enable_cam_button_clicked" swapped="no"/>
          </object>
          <packing>
            <property name="y">25</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="disable_camera_button">
            <property name="label" translatable="yes">Disable camera</property>
            <property name="width_request">0</property>
            <property name="height_request">0</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="on_disable_camera_button_clicked" swapped="no"/>
          </object>
          <packing>
            <property name="y">60</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="enable_microphone_button">
            <property name="label" translatable="yes">Enable microphone</property>
            <property name="width_request">0</property>
            <property name="height_request">0</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="on_enable_microphone_button_clicked" swapped="no"/>
          </object>
          <packing>
            <property name="y">95</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="disable_microphone_button">
            <property name="label" translatable="yes">Disable microphone</property>
            <property name="width_request">0</property>
            <property name="height_request">0</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="on_disable_microphone_button_clicked" swapped="no"/>
          </object>
          <packing>
            <property name="y">129</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="camera_show">
            <property name="width_request">100</property>
            <property name="height_request">80</property>
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <signal name="activate-current-link" handler="on_camera_show_activate_current_link" swapped="no"/>
          </object>
          <packing>
            <property name="x">322</property>
            <property name="y">63</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

【问题讨论】:

    标签: python linux bash tkinter gtk


    【解决方案1】:

    如果你只想让文字出现

    • 在该位置定义一个 Gtk.Label(使用 Glade)。
    • 将其标签定义为空(即清除 Glade 中的标签)。
    • 为 Gtk.Label 提供一个 ID,以便稍后在主代码中访问它
    • 必要时,使用 your_label_id.set_text('camera not loaded') 或其他。

    您还可以在 Glade 中设置标签文本,然后在代码中显示/隐藏它 your_label_id.hide()...show()

    【讨论】:

    • 感谢您的回答。我不明白你说什么。我在 Glade 内有一个标签 ID。我在 python 代码中有相同的 ID 名称。所以实际上我想显示一些来自 bash shell 命令的文本,但我不知道我在写什么……请用 tkinter 查看第一个 python 代码。它运行良好。
    猜你喜欢
    • 2013-06-06
    • 2021-11-30
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多