如何使用gtk在python窗口中显示文本



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

我感谢任何帮助!

谢谢

带有Tkinter的Python

#!/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()

带GTK的Python

#!/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()

Glade文件

<?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>

如果您只想使文本显示

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

您也可以在Glade中设置标签文本,然后用your_label_id.hide()...show()

最新更新