|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
0. 呃,学习有一段时间了,
大概学了下面这些:
窗口(QWidget),框架(QFrame),信号(Signal),槽(Slot),标签(QLabel),按钮(QPushButton),布局(Layout),托盘(QSystemTrayIcon),样式(QSS)。
当然只是了解了其中很少的一部分。
不过就算少也能做一些界面嘛, 练习练习。
1. 综合应用小栗子——关机程序。
1.0 呃,最近老是手残,明明点了关机早上发现居然还开着- -。。所以就试着写了这个小程序自己用~~。
1.1 如何实现关机?
想到了系统自带命令。
Linux没考虑,因为自己用的嘛。如果你想写个win和linux都想用的,呃,可以用。
- import platform
- platform.system()
复制代码
来判断是什么系统。
呐win下的关机命令就是
查看这个信息。
- 没有参数 显示帮助。这与键入 /? 是一样的。
- /? 显示帮助。这与不键入任何选项是一样的。
- /i 显示图形用户界面(GUI)。
- 这必须是第一个选项。
- /l 注销。这不能与 /m 或 /d 选项一起使用。
- /s 关闭计算机。
- /r 关闭并重新启动计算机。
- /g 关闭并重新启动计算机。系统重新启动后,
- 重新启动所有注册的应用程序。
- /a 中止系统关闭。
- 这只能在超时期间使用。
- /p 关闭本地计算机,没有超时或警告。
- 可以与 /d 和 /f 选项一起使用。
- /h 休眠本地计算机。
- 可以与 /f 选项一起使用。
- /e 记录计算机意外关闭的原因。
- /m \\computer 指定目标计算机。
- /t xxx 设置关闭前的超时为 xxx 秒。
- 有效范围是 0-315360000 (10 年),默认值为 30。
- 如果超时时间大于 0,则默示 /f
- 参数。
- /c "comment" 重启动或关闭的原因的注释。
- 最多允许 512 个字符。
- /f 强制正在运行的应用程序关闭,不前台警告用户。
- 当为 /t 参数指定大于 0 的值时,
- 则默示 /f 参数。
- /d [p|u:]xx:yy 提供重新启动或关机的原因。
- p 表明重新启动或关闭是计划内的。
- u 表示原因由用户定义。
- 如果 p 和 u 均未指定,则是计划外重新启动
- 或关闭。
复制代码
1.2 OK,知道了命令那我们把它封装在python里呗。
我创建了一个func.py文件。
- import os
- class ShutDown:
- def shutDown(self, time=0):
- # 关机。
- command = 'shutdown /s /t %d' % (time)
- os.system(command)
- def reset(self, time=0):
- # 重启。
- command = 'shutdown /r /t %d' % (time)
- os.system(command)
- def logout(self, time=0):
- # 注销。
- command = 'shutdown /l /t %d' % (time)
- os.system(command)
- def cancel(self):
- # 取消。
- os.system('shutdown /a')
复制代码
完全的调用命令,没啥好说的,关于直接点取消他的报错信息会在控制台显示,一般不用管,没啥用,除非你想根据报错来做一些其他的事, 这里没啥用,我就不管了。。
2. 窗口!
写好了功能,就开始画窗口吧~~。
先画了一张草图。。
自上而下呢,我想的大概就是这样子了。(画图细胞匮乏,那啥,轻点吐槽。。)
先导入我们可爱的模块们~。
- from PyQt5.QtWidgets import *
- from PyQt5.QtCore import *
- from PyQt5.QtGui import *
- import sys
- from func import ShutDown
复制代码
之后先定义一个主要的承载框架。
- class Main(QWidget):
- """框架部分。"""
- def __init__(self, parent=None):
- super(Main, self).__init__(parent)
- # 设置基本属性。
- self.main = parent
- self.setObjectName('main')
复制代码
然后为了美观一些,把自带的标题栏给去掉了,并设置了大小。
- self.setWindowFlags(Qt.FramelessWindowHint)
- self.resize(350,200)
复制代码
注: setWindowFlags还有很多,目前只用到这一个。其他的用到查手册吧。在QtCore.Qt下。FramelessWindowHint看意思也大概知道,无框架窗口
标题和图标想设置就设置吧,虽然最大化看不出来,但是隐藏在任务栏时的缩略图里还是会显示的,否则图标是python的logo,标题是python了。
2.1 给他加个托盘!
- self.icon = QIcon('pic/poweroff.png')
- self.tray = QSystemTrayIcon(self)
复制代码
定义出托盘和一个图标。图标也可以不定义。到时候直接用也行。
托盘最重要的就是菜单了,呃,提示也很重要。
- self.act_menu = QMenu(self)
- self.act_close = QAction(self)
- self.act_show = QAction(self)
复制代码
呃,只给菜单来了一个关闭和显示的动作。
2.2 主布局。
草图中想的是自上而下,自然布局就用垂直布局了。
- self.mainLayout = QVBoxLayout()
复制代码
别忘了设置。
- self.setLayout(self.mainLayout)
复制代码
2.3 属性设置。
托盘神马的定义好了,我们开始把他们武装起来吧。
- def set_trayIcon(self):
- # 基本托盘设定。
- self.tray.setIcon(self.icon)
- self.tray.activated.connect(self.show_tray)
- self.tray.setToolTip('定时关机')
- # 动作设定。
- self.act_close.setText('退出')
- self.act_close.triggered.connect(self.tray.hide)
- self.act_close.triggered.connect(self.close)
- self.act_show.setText('最大化')
- self.act_show.setShortcut('ctrl+w')
- self.act_show.triggered.connect(self.show)
- # 添加到菜单。
- self.act_menu.addAction(self.act_show)
- self.act_menu.addAction(self.act_close)
- # 将菜单添加给托盘。
- self.tray.setContextMenu(self.act_menu)
复制代码
定义了托盘的图标,给托盘激活信号连接到一个槽(函数)show_tray,之后给托盘写了一个鼠标放上去时的提示。
之后给关闭和显示动作添加的文本,触发时(就是单击或使用快捷键时,信号是triggered)的信号所连接的槽(函数)。
Q: 为什么退出连接了两个槽,退出不就是连tray一起销毁了嘛?隐藏起来干嘛呢。
A: 呃,测试的时候发现退出后,虽然销毁了,但是它(托盘)不会自动消失,要等鼠标放上去才消失,所以先把它隐藏了,在退出程序。
还给显示的动作加了一个快捷键,需要注意的是,菜单必须处于激活状态才能用快捷键。
将动作添加给菜单,把菜单扔给托盘。
下面是托盘的两个槽。
- def tri_tray(self):
- # 托盘相关函数。
- if not self.flag:
- self.tray.show()
- self.tray.showMessage('Tip', "缩小到这里了呦~~。")
- self.flag = True
- def show_tray(self, flag):
- # 托盘信号传递相关。
- if flag == 2:
- self.show()
复制代码
第一个槽是如果是第一次缩小,那么将托盘激活并显示提示信息。不手动隐藏托盘将会一直显示。self.flag是我自己定义的呃,我定义的self.flag = False
第二个槽是传递信号时。介绍托盘时发现activated信号无论左键右键都能单击激活,很是恼人,但是文档上写了可以有参数,不过写成activated()这样的形式会导致无法使用。因为信号不能调用嘛。。那究竟咋个传参。后来发现- QSystemTrayIcon::Unknown 0 Unknown reason
- QSystemTrayIcon::Context 1 The context menu for the system tray entry was requested
- QSystemTrayIcon::DoubleClick 2 The system tray entry was double clicked
- QSystemTrayIcon::Trigger 3 The system tray entry was clicked
- QSystemTrayIcon::MiddleClick 4 The system tray entry was clicked with the middle mouse button
复制代码
双击时的值为2,所以判断是不是2就知道是不是双击触发了。
OK,主框架基本完成了,因为没有实际效果就不截图了。
---
头部。
我是自上而下写的。
- class Header(QFrame):
- """头部"""
- def __init__(self, parent=None):
- super(Header, self).__init__(parent)
- # 设置基本属性。
- self.main = parent
- self.setObjectName('header')
- self.setWindowFlags(Qt.FramelessWindowHint)
- # 按钮。
- self.btn_exit = QPushButton(self)
- self.btn_min = QPushButton(self)
- # 标签。
- self.lab_title = QLabel(self)
- # 设置布局。
- self.mainLayout = QHBoxLayout()
- # 调用设置属性。
- self.set_button()
- self.set_label()
- self.set_layout()
-
- # 加载样式。
- with open('header.qss', 'r') as q:
- self.setStyleSheet(q.read())
- # 设置全局布局。
- self.setLayout(self.mainLayout)
复制代码
根据草图,设置了两个按钮当最小化和关闭,一个标签当标题。
需要横着排列,那么头部的主布局就设置成水平布局了(QHBoxLayout),
当然还给头部加了个样式。
属性设置。
- def set_button(self):
- # 退出。
- self.btn_exit.setObjectName('exit')
- self.btn_exit.setText('×')
- self.btn_exit.clicked.connect(self.main.tray.hide)
- self.btn_exit.clicked.connect(self.main.close)
- # 最小化。
- self.btn_min.setObjectName('mini')
- self.btn_min.setText('-')
- self.btn_min.clicked.connect(self.main.hide)
- self.btn_min.clicked.connect(self.main.tri_tray)
-
- def set_label(self):
- # 标题。
- self.lab_title.setObjectName('title')
- self.lab_title.setText('定时关机')
复制代码
按钮设置名字,文本,连接信号。标签设置名字,文本。
需要注意的是,因为我这是另一个类,我们要把它弄成Main的子类,所以退出时退出的是的父类窗口,隐藏的也是父类的窗口。
- def set_layout(self):
- # 布局。
- self.mainLayout.addWidget(self.lab_title)
- self.mainLayout.addStretch(1)
- self.mainLayout.addWidget(self.btn_min)
- self.mainLayout.addWidget(self.btn_exit)
复制代码
这个布局也没啥好说的。按次序排上去就行啦。
QSS里的设置也简单。
- QFrame#header{
- background: aqua;
- }
- QPushButton#exit, QPushButton#mini{
- border: 0px solid;
- color: gray;
- font-weight: bold;
- font-size: 15px;
- }
- QPushButton#exit:hover, QPushButton#mini:hover{
- color: black;
- }
- QLabel#title{
- color: black;
- font-weight: 200;
- font-size: 20px;
- }
复制代码
字面意思。不翻译了。。
写完了header我们把它添加给main。
在Main类里,你也可以重新写个专门的函数用于给Main添加新值设置布局啥的。我直接改的Main类。
Main类添加:
- self.header = Header(self)
复制代码
以及
- self.mainLayout.addWidget(self.header)
复制代码
效果:
因为现在只有一个所以头部占了全部的空间,先不用管,写完其他的一起规划。
---
中间(底部)。
底部的装饰没在写,只写了中间的功能区。
基本设置。
- class Center(QFrame):
- """中间部分"""
- def __init__(self, parent=None):
- super(Center, self).__init__(parent)
- # 设置基本属性。
- self.main = parent
- self.setObjectName('center')
- self.setWindowFlags(Qt.FramelessWindowHint)
- # 功能.
- self.func = ShutDown()
复制代码
没差别,基本一样。
部件定义。
- # 单选框。
- self.radio_shutdown = QRadioButton(self)
- self.radio_reset = QRadioButton(self)
- self.radio_logout = QRadioButton(self)
- # 设置时间。
- self.input_hour = QSpinBox(self)
- self.lab_hour = QLabel(self)
- self.input_minutes = QSpinBox(self)
- self.lab_minutes = QLabel(self)
- # 设置按钮。
- self.btn_start = QPushButton(self)
- self.btn_cancel = QPushButton(self)
- self.btn_exit = QPushButton(self)
复制代码
三个单选框,用于选择关机 or 重启 or 注销。
两个可上下选择的输入框,两个用于提示的label。
三个按钮,分别是启动,取消,和关闭(和x一样的功能)。
布局定义。
- self.mainLayout = QVBoxLayout()
- self.topLayout = QHBoxLayout()
- self.centerLayout = QHBoxLayout()
- self.bottomLayout = QHBoxLayout()
复制代码
根据草图呢,中间分成3个部分,上面是选项,中间是时间,下面的功能。
一个垂直布局里放着3个水平布局。
属性设置。
- def set_radio(self):
- # 默认关机。
- self.radio_shutdown.setText('关机')
- self.radio_shutdown.setChecked(True)
- self.radio_reset.setText('重启')
- self.radio_logout.setText('注销')
- def set_times(self):
- # 时间设置,默认7分钟后。
- self.input_hour.setValue(0)
- self.input_hour.setMinimum(0)
- self.input_hour.setMaximum(23)
- self.input_hour.setSingleStep(1)
- self.lab_hour.setText('小时')
- self.input_minutes.setValue(7)
- self.input_minutes.setMinimum(0)
- self.input_minutes.setMaximum(60)
- self.input_minutes.setSingleStep(1)
- self.lab_minutes.setText('分钟')
- def set_button(self):
- # 设置启动和取消按钮。
- self.btn_start.setObjectName('start')
- self.btn_start.setText('启动')
- self.btn_start.clicked.connect(self.exec_start)
- self.btn_cancel.setObjectName('cancel')
- self.btn_cancel.setText('取消')
- self.btn_cancel.clicked.connect(self.func.cancel)
- self.btn_exit.setObjectName('exit')
- self.btn_exit.setText('关闭')
- self.btn_exit.clicked.connect(self.main.tray.hide)
- self.btn_exit.clicked.connect(self.main.close)
复制代码
单选框定义文本,默认是关机。
输入框设置初始值和范围(可以直接用setRange()来设置),设置文本和步长。标签就写俩文本。
按钮分别连接槽(函数)。
相关的槽(函数)。
- def exec_start(self):
- # 处理时间。
- time = 3600 * int(self.input_hour.text()) + 60 * int(self.input_minutes.text())
- if self.radio_shutdown.isChecked():
- self.func.shutDown(time=time)
- elif self.radio_reset.isChecked():
- self.func.reset(time=time)
- else:
- self.func.logout(time-time)
复制代码
先把输入的小时和分化成秒,因为DOS命令只认识秒。
然后依次判断选中了那个,执行哪个功能,功能已经在func里面写好了。
设置布局。
- def set_layout(self):
- # 布局。
- self.topLayout.addWidget(self.radio_shutdown)
- self.topLayout.addWidget(self.radio_reset)
- self.topLayout.addWidget(self.radio_logout)
- self.topLayout.addStretch(1)
- self.centerLayout.addWidget(self.input_hour)
- self.centerLayout.addWidget(self.lab_hour)
- self.centerLayout.addWidget(self.input_minutes)
- self.centerLayout.addWidget(self.lab_minutes)
- self.bottomLayout.addStretch(1)
- self.bottomLayout.addWidget(self.btn_start)
- self.bottomLayout.addWidget(self.btn_cancel)
- self.bottomLayout.addWidget(self.btn_exit)
- self.mainLayout.addLayout(self.topLayout)
- self.mainLayout.addLayout(self.centerLayout)
- self.mainLayout.addLayout(self.bottomLayout)
复制代码
依次添加,没啥好说的。
样式。
只是改变了一下颜色和加粗。。
- QRadioButton{
- color: #880000;
- font-weight: bold;
- font-size: 12px;
- }
- QPushButton{
- color: #5577AA;
- font-weight: bold;
- font-size: 12px;
- }
复制代码
还是要把center也添加到main里。
Main类:
- self.center = Center(self)
复制代码
以及
- self.mainLayout.addWidget(self.center)
复制代码
此时会发现很诡异,多了这么多空白。
稍稍修改一下Main类里面的布局。
- self.mainLayout.setContentsMargins(0, 0, 0, 0)
- self.mainLayout.setStretch(0, 50)
- self.mainLayout.setStretch(1, 150)
复制代码
设置各个部件见的外边距。上下左右依次是0,0,0,0.。。
设置第一个和第二个部件的比例大小是50:150,也就是1:3。不用化简,直接用按照主窗口的大小,写上就行。化简神马的交给他自己处理。
效果:
功能效果和直接扣命令效果是一样的。
---
界面完善。
有个小问题,就是把标题栏隐藏之后,窗口就不能拖动了。
那需要重写鼠标事件来完成拖动。我在header里写的。因为main被我们覆盖掉了。
- def mousePressEvent(self, event):
- if event.buttons() == Qt.LeftButton:
- self.position = event.globalPos() - self.main.pos()
- event.accept()
- def mouseMoveEvent(self, event):
- if event.buttons() == Qt.LeftButton:
- self.main.move(event.globalPos() - self.position)
- event.accept()
复制代码
鼠标按下时的事件。
如果此时是鼠标左键。
那么将会定义一个变量self.position值为鼠标的位置-窗口位置。就是鼠标相对于窗口的差值。
还要在往左一直到屏幕左边。
然后当鼠标移动了。
这个时候鼠标的位置,再把之前的位置减掉。
然后就能拖动了。
有神马BUG要和我说呦~~。
全部代码:
- # 界面布局。
- # 无任何功能。
- from PyQt5.QtWidgets import *
- from PyQt5.QtCore import *
- from PyQt5.QtGui import *
- import sys
- from func import ShutDown
- class Main(QWidget):
- """框架部分。"""
- def __init__(self, parent=None):
- super(Main, self).__init__(parent)
- # 设置基本属性。
- self.main = parent
- self.setObjectName('main')
- self.setWindowFlags(Qt.FramelessWindowHint)
- self.resize(350,200)
- # 设置系统托盘。
- self.icon = QIcon('pic/poweroff.png')
- self.tray = QSystemTrayIcon(self)
- # 给托盘添加动作。
- self.act_menu = QMenu(self)
- self.act_close = QAction(self)
- self.act_show = QAction(self)
- # 设置提示信号。
- self.flag = False
- # 加载其他界面。
- self.header = Header(self)
- self.center = Center(self)
- # 设置布局。
- self.mainLayout = QVBoxLayout()
- # 调用设置属性。
- self.set_trayIcon()
- self.set_layout()
- # 设置全局布局。
- self.setLayout(self.mainLayout)
- def set_trayIcon(self):
- # 基本托盘设定。
- self.tray.setIcon(self.icon)
- self.tray.activated.connect(self.show_tray)
- self.tray.setToolTip('定时关机')
- # 动作设定。
- self.act_close.setText('退出')
- self.act_close.triggered.connect(self.tray.hide)
- self.act_close.triggered.connect(self.close)
- self.act_show.setText('最大化')
- self.act_show.setShortcut('ctrl+w')
- self.act_show.triggered.connect(self.show)
- # 添加到菜单。
- self.act_menu.addAction(self.act_show)
- self.act_menu.addAction(self.act_close)
- # 将菜单添加给托盘。
- self.tray.setContextMenu(self.act_menu)
- def tri_tray(self):
- # 托盘相关函数。
- if not self.flag:
- self.tray.show()
- self.tray.showMessage('Tip', "缩小到这里了呦~~。")
- self.flag = True
- def show_tray(self, flag):
- # 托盘信号传递相关。
- if flag == 2:
- self.show()
- def set_layout(self):
- # 布局。
- self.mainLayout.addWidget(self.header)
- self.mainLayout.addWidget(self.center)
- self.mainLayout.setContentsMargins(0, 0, 0, 0)
- self.mainLayout.setStretch(0, 50)
- self.mainLayout.setStretch(1, 150)
- class Header(QFrame):
- """头部"""
- def __init__(self, parent=None):
- super(Header, self).__init__(parent)
- # 设置基本属性。
- self.main = parent
- self.setObjectName('header')
- self.setWindowFlags(Qt.FramelessWindowHint)
- # 按钮。
- self.btn_exit = QPushButton(self)
- self.btn_min = QPushButton(self)
- # 标签。
- self.lab_title = QLabel(self)
- # 设置布局。
- self.mainLayout = QHBoxLayout()
- # 调用设置属性。
- self.set_button()
- self.set_label()
- self.set_layout()
-
- # 加载样式。
- with open('header.qss', 'r') as q:
- self.setStyleSheet(q.read())
- # 设置全局布局。
- self.setLayout(self.mainLayout)
- def set_button(self):
- # 退出。
- self.btn_exit.setObjectName('exit')
- self.btn_exit.setText('×')
- self.btn_exit.clicked.connect(self.main.tray.hide)
- self.btn_exit.clicked.connect(self.main.close)
- # 最小化。
- self.btn_min.setObjectName('mini')
- self.btn_min.setText('-')
- self.btn_min.clicked.connect(self.main.hide)
- self.btn_min.clicked.connect(self.main.tri_tray)
-
- def set_label(self):
- # 标题。
- self.lab_title.setObjectName('title')
- self.lab_title.setText('定时关机')
- def set_layout(self):
- # 布局。
- self.mainLayout.addWidget(self.lab_title)
- self.mainLayout.addStretch(1)
- self.mainLayout.addWidget(self.btn_min)
- self.mainLayout.addWidget(self.btn_exit)
- """重写鼠标事件。"""
- def mousePressEvent(self, event):
- if event.buttons() == Qt.LeftButton:
- self.position = event.globalPos() - self.main.pos()
- event.accept()
- def mouseMoveEvent(self, event):
- if event.buttons() == Qt.LeftButton:
- self.main.move(event.globalPos() - self.position)
- event.accept()
- class Center(QFrame):
- """中间部分"""
- def __init__(self, parent=None):
- super(Center, self).__init__(parent)
- # 设置基本属性。
- self.main = parent
- self.setObjectName('center')
- self.setWindowFlags(Qt.FramelessWindowHint)
- # 功能.
- self.func = ShutDown()
- # 单选框。
- self.radio_shutdown = QRadioButton(self)
- self.radio_reset = QRadioButton(self)
- self.radio_logout = QRadioButton(self)
- # 设置时间。
- self.input_hour = QSpinBox(self)
- self.lab_hour = QLabel(self)
- self.input_minutes = QSpinBox(self)
- self.lab_minutes = QLabel(self)
- # 设置按钮。
- self.btn_start = QPushButton(self)
- self.btn_cancel = QPushButton(self)
- self.btn_exit = QPushButton(self)
- # 设置布局。
- self.mainLayout = QVBoxLayout()
- self.topLayout = QHBoxLayout()
- self.centerLayout = QHBoxLayout()
- self.bottomLayout = QHBoxLayout()
- # 加载属性设置。
- self.set_radio()
- self.set_times()
- self.set_button()
- self.set_layout()
- # 加载样式。
- with open('center.qss', 'r') as q:
- self.setStyleSheet(q.read())
- # 设置全局布局。
- self.setLayout(self.mainLayout)
- def set_radio(self):
- # 默认关机。
- self.radio_shutdown.setText('关机')
- self.radio_shutdown.setChecked(True)
- self.radio_reset.setText('重启')
- self.radio_logout.setText('注销')
- def set_times(self):
- # 时间设置,默认7分钟后。
- self.input_hour.setValue(0)
- self.input_hour.setMinimum(0)
- self.input_hour.setMaximum(23)
- self.input_hour.setSingleStep(1)
- self.lab_hour.setText('小时')
- self.input_minutes.setValue(7)
- self.input_minutes.setMinimum(0)
- self.input_minutes.setMaximum(60)
- self.input_minutes.setSingleStep(1)
- self.lab_minutes.setText('分钟')
- def set_button(self):
- # 设置启动和取消按钮。
- self.btn_start.setObjectName('start')
- self.btn_start.setText('启动')
- self.btn_start.clicked.connect(self.exec_start)
- self.btn_cancel.setObjectName('cancel')
- self.btn_cancel.setText('取消')
- self.btn_cancel.clicked.connect(self.func.cancel)
- self.btn_exit.setObjectName('exit')
- self.btn_exit.setText('关闭')
- self.btn_exit.clicked.connect(self.main.tray.hide)
- self.btn_exit.clicked.connect(self.main.close)
- def exec_start(self):
- # 处理时间。
- time = 3600 * int(self.input_hour.text()) + 60 * int(self.input_minutes.text())
- if self.radio_shutdown.isChecked():
- self.func.shutDown(time=time)
- elif self.radio_reset.isChecked():
- self.func.reset(time=time)
- else:
- self.func.logout(time-time)
-
- def set_layout(self):
- # 布局。
- self.topLayout.addWidget(self.radio_shutdown)
- self.topLayout.addWidget(self.radio_reset)
- self.topLayout.addWidget(self.radio_logout)
- self.topLayout.addStretch(1)
- self.centerLayout.addWidget(self.input_hour)
- self.centerLayout.addWidget(self.lab_hour)
- self.centerLayout.addWidget(self.input_minutes)
- self.centerLayout.addWidget(self.lab_minutes)
- self.bottomLayout.addStretch(1)
- self.bottomLayout.addWidget(self.btn_start)
- self.bottomLayout.addWidget(self.btn_cancel)
- self.bottomLayout.addWidget(self.btn_exit)
- self.mainLayout.addLayout(self.topLayout)
- self.mainLayout.addLayout(self.centerLayout)
- self.mainLayout.addLayout(self.bottomLayout)
- if __name__ == '__main__':
- app = QApplication(sys.argv)
- main = Main()
- main.show()
- sys.exit(app.exec_())
复制代码
|
评分
-
参与人数 5 | 荣誉 +27 |
鱼币 +27 |
贡献 +19 |
收起
理由
|
~风介~
| + 5 |
+ 5 |
+ 5 |
热爱鱼C^_^ |
破灬王
| + 5 |
+ 5 |
+ 3 |
热爱鱼C^_^ |
lightninng
| + 2 |
+ 2 |
|
感谢楼主无私奉献! |
拈花小仙
| + 5 |
+ 5 |
+ 3 |
感谢楼主无私奉献! |
小甲鱼
| + 10 |
+ 10 |
+ 8 |
帅爆了~ |
查看全部评分
|