Python有很多GUI库:tkinter,wxWidgets,pyGTK等。但是所有这些GUI都需要安装并且非常重量级,所以部署最终用户GUI python应用程序来传递提到的GUI库有点复杂。

最近,我考虑过python的内置ctypes模块。从理论上讲,可以创建一个纯的python GUI库,它将在Windows上使用windll.user32.CreateWindowEx(<=>等),在MacOS上使用本机pyObjC,在gnome / kde上使用pyGTK / pyQt。这样的图书馆存在吗?如果没有,你认为这个想法有什么问题?

有帮助吗?

解决方案

努力程度最低,效果最好的方法是了解使用现有GUI库部署应用程序需要做些什么。

其他提示

从Python 2.7和3.1开始,Tk看起来会好很多。

http://docs.python。组织的/ dev / whatsnew / 2.7.html#TTK-主题的小部件换TK

<!>“Tcl / Tk 8.5包含一组主题小部件,它们重新实现了基本的Tk小部件,但具有更多可自定义的外观,因此可以更接近本机平台<!>#8217;小部件。这个小部件集最初被称为Tile,但在被添加到Tcl / Tck 8.5版时被重命名为Ttk(对于<!>#8220;主题为Tk <!>#8221;)。<!>

Tkinter是python标准发行版的一部分,默认安装。期望在所有首先有图形显示的python安装上找到它。

纯粹的python gui库<!>的概念<!>是错误的,因为最终你将使用系统级调用和小部件,可能是通过ctypes,但这并没有改变这样一个事实:如果你开始实现你的想法,你最终将成为wxPython

主要是错误的是它重新发明了GTK,Tk,Wx,QT及其同类制造商已经完成的车轮。虽然纯python GUI在技术上是可行的,而像 anygui 这样的项目确实尝试了类似的东西,但是相对来说很少通过这样做获益。

本机工具包还可以更好地覆盖底层平台之间的差异(本机对话框等)。这意味着工具包允许您编写一个可移植的应用程序,该应用程序几乎不需要任何特定于平台的代码 - 其中大部分代码都是由底层工具包提取的。

Windows上的py2exe和任何linux方法之类的分发机制允许您将DLL与应用程序捆绑在一起,因此您可以创建一个安装程序来删除它所需的任何本机组件。但是,实际上没有通用的跨平台方法,因此您需要为每个平台维护单独的安装程序。

首先,所有这些库都使用不同的抽象,所以任何与它们一起工作的东西都可能最终支持一个最小公分母的功能集,做很多努力充分利用每一个。

不确定你的意思<!>重量级。<!>

wx在每个平台上使用本机控件,并且在Python中使用起来就像我想象的那样容易;毕竟,GUI API很复杂,因为GUI会变得复杂。

我认为wx,因为构建窗口所需的努力以及屏幕上显示的内容的质量非常好。我认为你不可能自己推出更好的东西。

我认为这不是发明轮子。它会工作,但你为什么要这样做?您提到的所有GUI库都是稳定的,或多或少是防弹。

我可以想象有一些实验实现了纯python库。但我从未见过一个。关于GUI的一切都是艰苦的工作,纯粹的python库不会有这么大的受众。

如何在tkinter周围使用轻量级包装器,以便它不需要大量设置? PySimpleGUI 建立在tkinter之上,这意味着它可以在tkinter运行的任何地方运行。

与使用tkinter相比,使用它的优势在于所需的代码量。 PySimpleGUI程序往往非常紧凑。

以下示例显示了使用许多可用小部件的自定义布局。

生成它的代码就在最后。它可能看起来像很多代码,但就是这样。它需要页面和页面以及tkinter代码页面做同样的事情。

import PySimpleGUI as sg

sg.ChangeLookAndFeel('GreenTan')
# ------ Menu Definition ------ #
menu_def = [['&File', ['&Open', '&Save', 'E&xit', 'Properties']],
            ['&Edit', ['Paste', ['Special', 'Normal', ], 'Undo'], ],
            ['&Help', '&About...'], ]
# ------ Column Definition ------ #
column1 = [[sg.Text('Column 1', background_color='lightblue', justification='center', size=(10, 1))],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 1')],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 2')],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 3')]]

layout = [
    [sg.Menu(menu_def, tearoff=True)],
    [sg.Text('(Almost) All widgets in one Window!', size=(30, 1), justification='center', font=("Helvetica", 25), relief=sg.RELIEF_RIDGE)],
    [sg.Text('Here is some text.... and a place to enter text')],
    [sg.InputText('This is my text')],
    [sg.Frame(layout=[
    [sg.Checkbox('Checkbox', size=(10,1)),  sg.Checkbox('My second checkbox!', default=True)],
    [sg.Radio('My first Radio!     ', "RADIO1", default=True, size=(10,1)), sg.Radio('My second Radio!', "RADIO1")]], title='Options',title_color='red', relief=sg.RELIEF_SUNKEN, tooltip='Use these to set flags')],
    [sg.Multiline(default_text='This is the default Text should you decide not to type anything', size=(35, 3)),
     sg.Multiline(default_text='A second multi-line', size=(35, 3))],
    [sg.InputCombo(('Combobox 1', 'Combobox 2'), size=(20, 1)),
     sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85)],
    [sg.InputOptionMenu(('Menu Option 1', 'Menu Option 2', 'Menu Option 3'))],
    [sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)),
     sg.Frame('Labelled Group',[[
     sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25),
     sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=75),
     sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=10),
     sg.Column(column1, background_color='lightblue')]])],
    [sg.Text('_' * 80)],
    [sg.Text('Choose A Folder', size=(35, 1))],
    [sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'),
     sg.InputText('Default Folder'), sg.FolderBrowse()],
    [sg.Submit(tooltip='Click to submit this form'), sg.Cancel()]]

window = sg.Window('Everything bagel', default_element_size=(40, 1), grab_anywhere=False).Layout(layout)
button, values = window.Read()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top