为什么Tkinter可以是程序性的,PyQt只能用于OO范例?

时间:2015-04-08 17:49:52

标签: python tkinter pyqt

我一直在Python3中编程并使用Tkinter来创建GUI。我最近被介绍到PyQT并且意识到GUI工具包在其样式和小部件范围方面有多好。

我主要以程序方式使用Tkinter,它在GUI构建方面运行良好。我意识到PyQT使用OOP范例来创建GUI。

我是否认为以下内容正确描述了tkinter和PyQT在工作方式上有何不同......?

  • 使用Tkinter,您可以生成一个窗口对象,然后创建窗口小部件对象(按钮,标签等)(所有这些窗口小部件都是单独的对象),每次将它们放在窗口上,就像在一张纸上粘贴不同的图片一样, 这就是为什么你可以用程序方式创建tkinter GUI
  • 但是,使用PyQT,您可以以相同的方式生成窗口对象,但是如果您希望窗口小部件出现在窗口对象上,则不要单独创建它们并像Tkinter一样“粘贴”它们。相反,您必须为窗口对象创建一个新类(蓝图),从PyQT父类继承各种小部件,创建这些小部件(对象)并将它们构建到新类(作为属性),以便在实例化时window对象,它附带了在窗口的自定义类中设置的所有小部件。这是为什么使用PyQt只能使用面向对象的范例

这是对的吗?如果没有,我的理解在哪里出错了? 感谢。

2 个答案:

答案 0 :(得分:3)

我只能谈论tkinter,但两种模式都很有用。程序代码对于使用最少的样板进行探索非常有用。例如,从空闲编辑器运行以下内容(故意没有mainloop()调用)

from tkinter import *
from tkinter.font import Font

root = Tk()
spin = Spinbox(root, from_=0, to=9, width=3,
               font=Font(family='Helvetica', size=36, weight='bold'))
spin.pack()

我可以交互式地尝试更改spin的属性,例如输入

>>> spin['fg'] = 'red'
>>> spin['fg'] = 'blue'
>>> spin['justify'] = 'right'

但是,对于任何复杂的完成应用程序,我认为最好将gui设置代码放在一个或多个类的一个或多个方法中。例如,Idle是一个tkinter应用程序,由许多类组成,这些类可以子组化窗口小部件或包含窗口小部件。

答案 1 :(得分:2)

我感谢你们所有人帮助我理解我理解中的错误。

对于介绍PyQt的任何其他人(来自tkinter背景之后)并阅读说明PyQt需要OOP方法的教程,以下两个完全相同的程序表明情况并非如此(尽管很明显,构建大型应用程序,建议使用OOP方法。

程序性PyQt:

import sys
from PyQt5.QtWidgets import (QWidget, QToolTip,
    QPushButton, QApplication)
from PyQt5.QtGui import QFont

app = QApplication(sys.argv)

w = QWidget()

QToolTip.setFont(QFont('SansSerif', 10))
w.setToolTip('This is a <b>QWidget</b> widget')

btn = QPushButton('Button', w)
btn.setToolTip('This is a <b>QPushButton</b> widget')
btn.resize(btn.sizeHint())
btn.move(50, 50)

w.setGeometry(300, 300, 300, 200)
w.setWindowTitle('Tool Tips')
w.show()

sys.exit(app.exec_())

OOP PyQt:

import sys
from PyQt5.QtWidgets import (QWidget, QToolTip,
    QPushButton, QApplication)
from PyQt5.QtGui import QFont


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        QToolTip.setFont(QFont('SansSerif', 10))

        self.setToolTip('This is a <b>QWidget</b> widget')

        btn = QPushButton('Button', self)
        btn.setToolTip('This is a <b>QPushButton</b> widget')
        btn.resize(btn.sizeHint())
        btn.move(50, 50)

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Tooltips')
        self.show()

app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

感谢大家的评论并帮助我实现了我的愚蠢。