背景:
使用Linux系统已经有一段时间了,在管理系统是几乎都是使用命令行与内核交流的,使用虽多的就是Shell,其次就是python。这两天突然心血来潮,想到了Linux PC端桌面程序,在我个人的熟悉语言中呢,python比较适合,不过、开发Linux桌面我只是玩玩的。对于开发Linux桌面程序掌握Python的推荐使用Python Gtk3。
想玩出一个Linux基本桌面程序( 几乎没有业务逻辑 ),看完下面的( 重点是图片 | UI组件 ),大概就有一个底了!
1、入门Hello word
源码code
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
# 定义我的hello窗口
class Application(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Hello word")
# 实例化
app = Application()
app.show_all()
Gtk.main()
执行execute
Hello word
2-1、布局之boxes布局
源码code
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class BoxesContainer(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="BoxesContainer")
# 定义一个盒子
self.box = Gtk.Box(spacing=6)
# 将盒子布局在窗口
self.add(self.box)
# 定义两个按钮并放置于盒子
self.button1 = Gtk.Button(label="Hello")
self.button1.connect("clicked", self.say_hello)
self.box.pack_start(self.button1, True, True, 0)
self.button2 = Gtk.Button(label="Goodbye")
self.button2.connect("clicked", self.say_goodbye)
self.box.pack_start(self.button2, True, True, 0)
@staticmethod
def say_hello(widget):
print("Hello")
@staticmethod
def say_goodbye(widget):
print("Goodbye")
win = BoxesContainer()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
执行execute
BoxesContainer
2-2、布局之卡片式布局
源码code
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class GridContainer(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="GridContainer")
# 定义一个卡片
grid = Gtk.Grid()
# 将卡片放置于窗口
self.add(grid)
# 定义按钮将布置于卡片上
button1 = Gtk.Button(label="Button 1")
button2 = Gtk.Button(label="Button 2")
button3 = Gtk.Button(label="Button 3")
button4 = Gtk.Button(label="Button 4")
button5 = Gtk.Button(label="Button 5")
button6 = Gtk.Button(label="Button 6")
grid.add(button1)
# 指定具体位置
grid.attach(button2, 1, 0, 2, 1)
# 相对布局
grid.attach_next_to(button3, button1, Gtk.PositionType.BOTTOM, 1, 2)
grid.attach_next_to(button4, button3, Gtk.PositionType.RIGHT, 2, 1)
grid.attach(button5, 1, 2, 1, 1)
grid.attach_next_to(button6, button5, Gtk.PositionType.RIGHT, 1, 1)
win = GridContainer()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
执行execute
GridContainer
2-3、布局之list布局
源码code
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
# 继承Gtk.ListBoxRow
class ListBoxRowWithData(Gtk.ListBoxRow):
def __init__(self, data):
super(Gtk.ListBoxRow, self).__init__()
self.data = data
self.add(Gtk.Label(data))
class ListBoxWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="ListBoxContainer")
# 设置窗口宽度
self.set_border_width(10)
# 定义一个盒子桥梁 | 垂直排列 | 间隔为6
box_outer = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
self.add(box_outer)
# 定义一个list容器
listbox = Gtk.ListBox()
listbox.set_selection_mode(Gtk.SelectionMode.NONE)
box_outer.pack_start(listbox, True, True, 0)
# 定义一个行箱子
row = Gtk.ListBoxRow()
# 定义一个原子盒子 | 水平装产品
box1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=50)
# 定义标签
internal_time_label = Gtk.Label("是否自动对齐网络时间", xalign=0)
# 定义一个开关按钮
switch = Gtk.Switch()
switch.props.valign = Gtk.Align.CENTER
# 装箱
box1.pack_start(internal_time_label, True, True, 0)
box1.pack_start(switch, False, True, 0)
row.add(box1)
listbox.add(row)
# 定义ListBoxRow
row = Gtk.ListBoxRow()
# 定义一个Box | 水平布局
h_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=50)
label = Gtk.Label("日期格式", xalign=0)
combo = Gtk.ComboBoxText()
combo.insert(0, "0", "24-hour")
combo.insert(1, "1", "AM/PM")
h_box.pack_start(label, True, True, 0)
h_box.pack_start(combo, False, True, 0)
row.add(h_box)
listbox.add(row)
# 在定义一个ListBox
listbox_2 = Gtk.ListBox()
items = ["PHP", "Python", "Shell"]
for item in items:
listbox_2.add(ListBoxRowWithData(item))
box_outer.pack_start(listbox_2, True, True, 0)
win = ListBoxWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
执行excute
ListBoxContainer
2-4、StackSwitcher
源码code
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class StackWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="StackWindow")
self.set_border_width(10)
vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
self.add(vbox)
# 定义Stack
stack = Gtk.Stack()
stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT_RIGHT)
# 动画时长1s
stack.set_transition_duration(1000)
zone_1 = Gtk.Label("世界上最好的语言 没有之一")
stack.add_titled(zone_1, "说明", "PHP")
zone_2 = Gtk.Label("时日不多 赶紧使用Python")
stack.add_titled(zone_2, "说明", "Python")
stack_switcher = Gtk.StackSwitcher()
stack_switcher.set_stack(stack)
vbox.pack_start(stack_switcher, True, True, 0)
vbox.pack_start(stack, True, True, 0)
win = StackWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
执行execute
StackSwitcher
2-5、HeaderBar
源码code
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import gi
from gi.overrides.Gio import Gio
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class HeaderBarWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="HeaderBar")
self.set_border_width(10)
self.set_default_size(400, 300)
# 定义HeaderBar
hb = Gtk.HeaderBar()
# 隐藏原有的工具按钮
hb.set_show_close_button(False)
hb.props.title = "HeaderBar"
self.set_titlebar(hb)
button = Gtk.Button()
icon = Gio.ThemedIcon(name="mail-send-receive-symbolic")
image = Gtk.Image.new_from_gicon(icon, Gtk.IconSize.BUTTON)
button.add(image)
# 放置于HeaderBar左边
hb.pack_end(button)
box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
Gtk.StyleContext.add_class(box.get_style_context(), "linked")
button = Gtk.Button()
button.add(Gtk.Arrow(Gtk.ArrowType.LEFT, Gtk.ShadowType.NONE))
box.add(button)
button = Gtk.Button()
button.add(Gtk.Arrow(Gtk.ArrowType.RIGHT, Gtk.ShadowType.NONE))
box.add(button)
# 放置于HeaderBar左边
hb.pack_start(box)
self.add(Gtk.TextView())
win = HeaderBarWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
执行execute
HeaderBar
2-6、FlowBox
源码code
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class FlowBoxWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="FlowBox Demo")
self.set_border_width(10)
self.set_default_size(300, 250)
# HeaderBar
header = Gtk.HeaderBar(title="Flow