为什么 Tkinter 可以是程序化的,而 PyQt 只能与 OO 范式一起使用?
Why Tkinter can be procedural and PyQt can only be used just with the OO paradigm?
我一直在 Python3 编程并使用 Tkinter 创建 GUI。我最近接触了 PyQT,并意识到 GUI 工具包在其样式和小部件范围方面要好得多。
我主要以程序方式使用 Tkinter,它在 GUI 构建方面运行良好。我意识到 PyQT 使用 OOP 范例来创建 GUI。
我是否认为以下内容正确描述了 tkinter 和 PyQT 在工作方式上的不同...?
- 使用 Tkinter,您生成一个 window 对象,然后创建小部件对象(按钮、标签等)(所有这些小部件都是单独的对象),每次将它们放在 window就像在一张纸上粘贴不同的图片,这就是为什么你可以以程序化的方式创建 tkinter GUI。
- 然而,使用 PyQT,您可以用相同的方式生成一个 window 对象,但是如果您希望小部件出现在 window 对象上,您不需要单独创建它们 'stick them on' 就像 Tkinter 一样。相反,您必须为 window 对象创建一个新的 class(蓝图),从 PyQT 父 classes 继承各种小部件,创建这些小部件(对象)并将它们构建到您的新 class(作为属性),这样当您实例化 window 对象时,它会附带在 window 的自定义 class 中设置的所有小部件。这就是 为什么 PyQt 只能使用面向对象的范例。
这是正确的吗?如果不是,我的理解哪里出了问题?
谢谢。
我只能说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 应用程序,由许多 类 组成,它们要么是小部件的子类,要么包含小部件。
感谢大家帮助我理解我理解中的错误。
对于任何其他被介绍到 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_())
谢谢大家的评论,让我认识到自己的愚蠢。
我一直在 Python3 编程并使用 Tkinter 创建 GUI。我最近接触了 PyQT,并意识到 GUI 工具包在其样式和小部件范围方面要好得多。
我主要以程序方式使用 Tkinter,它在 GUI 构建方面运行良好。我意识到 PyQT 使用 OOP 范例来创建 GUI。
我是否认为以下内容正确描述了 tkinter 和 PyQT 在工作方式上的不同...?
- 使用 Tkinter,您生成一个 window 对象,然后创建小部件对象(按钮、标签等)(所有这些小部件都是单独的对象),每次将它们放在 window就像在一张纸上粘贴不同的图片,这就是为什么你可以以程序化的方式创建 tkinter GUI。
- 然而,使用 PyQT,您可以用相同的方式生成一个 window 对象,但是如果您希望小部件出现在 window 对象上,您不需要单独创建它们 'stick them on' 就像 Tkinter 一样。相反,您必须为 window 对象创建一个新的 class(蓝图),从 PyQT 父 classes 继承各种小部件,创建这些小部件(对象)并将它们构建到您的新 class(作为属性),这样当您实例化 window 对象时,它会附带在 window 的自定义 class 中设置的所有小部件。这就是 为什么 PyQt 只能使用面向对象的范例。
这是正确的吗?如果不是,我的理解哪里出了问题? 谢谢。
我只能说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 应用程序,由许多 类 组成,它们要么是小部件的子类,要么包含小部件。
感谢大家帮助我理解我理解中的错误。
对于任何其他被介绍到 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_())
谢谢大家的评论,让我认识到自己的愚蠢。