【问题标题】:How do programming languages draw GUI like Tkinter for example?例如,编程语言如何绘制像 Tkinter 这样的 GUI?
【发布时间】:2020-06-30 22:30:10
【问题描述】:

我是一名 comp sci 学生,正在学习一些编译器设计,我有一个快速的问题困扰着我。

我目前正在用 JavaScript(在 nodeJS 上运行)编写一个解释器,它接受如下语句:

x = 4
print x

这将导致控制台输出: 4

我可以很容易地解析这些语句并将它们输出到控制台窗口。但是这个过程如何与 GUI 应用程序一起工作呢?

我的理解是这样,我们以Python为例。

当您在命令行中运行python 时,它会启动一个控制台应用程序,该应用程序接收python 命令并解释它们。 (我知道它首先会转换为字节码,但它最终会被解释)。

如果它看到1+1,我了解它如何解析它并将2 返回到它已经运行的控制台窗口。在这种情况下,Python 本身是一个控制台应用程序,因此用户输入指令的控制台输出也可以在控制台上很直观。

我已经做到了。但这也适用于 python:

from tkinter import*
t = Tk()

这是如何工作的? Python 解释器/VM 是否以某种方式调用 Win32 API 函数?还是它自己绘制窗口?

提前感谢您为澄清这一点提供的任何帮助。

【问题讨论】:

标签: python tkinter python-internals


【解决方案1】:

tkinter 本质上只是Tk 库的 Python 接口。这是一个开源库,可在所有流行的操作系统上运行,并为 GUI 元素提供一致的 API。

我不认为 Python 有任何内置的 GUI 函数,它依赖于这样的外部库。

【讨论】:

    【解决方案2】:

    当您处理编程时,您能够做的很多事情都取决于现有的库和 API。如果您每次都必须重新发明轮子,那么您将永远无法完成任何有意义的事情。

    一个更简单的例子是你的print() 电话。这只是一个写入stdout 的包装器。您正在使用的 bash shell / OS 处理标准输出发生的情况。 GUI 或多或少是相同的东西,只是路径稍微复杂一些。

    tkinter 是一个用于生成 GUI 界面的 Python 库。它本身只不过是更通用的 Tk 库的包装器。 Tk 是一个跨平台工作的通用 GUI 库。它通过创建利用为每个操作系统的 GUI 库定制的代码来做到这一点。最终创建 GUI 的是 OS* 本身。

    *这是一种概括,因为在某些操作系统(例如使用 Gnome 之类的操作系统)中,GUI 界面与操作系统的分离度比人们通常想象的要高。

    【讨论】:

    • shell 不处理stdout,除了它提供将其重定向到文件和管道的操作。
    • @Barmar:不,但它最终会显示它,就像你说的那样做一些处理。我试图在不写论文的情况下理解一般观点。
    • 那么当我解析“print 5”并将“5”作为结果返回给用户时,这是实现打印功能的错误方式吗?
    • @Lauren835 这些没有可比性。 print "5" 是将 5 写入输出的命令,在命令行应用程序中通常为 stdout。 return "5" 将“5”的值返回给调用您的应用程序的事物或调用它的函数。如果这是 main 函数,它将导致您的 shell 认为程序出错,因为 0 以外的任何值都表示错误。
    • 对不起,我把这个问题用错了。我想说的是。在我的解释器中,当我解析“print 5”时,它会执行:`console.log("5") in Javascript。应该这样吗?
    【解决方案3】:

    很久以前有人写了一个库,可以直接访问屏幕并打开或关闭像素。然后,他们编写了一个函数,该函数采用两个 x,y 对并计算需要打开以绘制一条线的所有像素。然后库将调用该函数来打开或关闭像素。

    然后其他人创建了一个位于该库之上的库,并使用它不仅可以绘制线条,还可以绘制框或圆等等。

    其他人在此基础上创建了一个库,可以读取字体描述并将其转换为屏幕上的文本。然后有人创建了一个库,它结合了字体库和行库来创建一个创建窗口和检查按钮的库。然后有人想出了如何添加颜色、对象旋转和 3d 效果等等。

    最终我们会得到类似 tkinter 的东西,它是一个库,具有创建输入小部件的功能,它调用一个将 python 转换为 tcl 的 tcl/tk 库,它调用一个 X11 或 DirectX 或 Win32 或 Cocoa或 OpenGL 库,它接受输入并调用其他函数,最终在物理显示器上打开或关闭像素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 2020-12-25
      相关资源
      最近更新 更多