在导入的函数中,Python Xlib无法正常工作

时间:2018-03-23 18:19:28

标签: python xlib

我试图使用python Xlib库,并且遇到了Xlib函数在我定义然后导入的函数内部似乎不起作用的问题。

例如,如果我使用Python Xlib附带的示例程序childwin.py,只需将其放在名为childtest.py的文件中的函数中,如下所示:

#Python 2/3 compatibility.
from __future__ import print_function

import sys
import os

# Change path so we find Xlib
def xlib_test():
    print('Running xlib_test()')

    sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

    from Xlib import X, display, Xutil

    # Application window
    class Window(object):
        def __init__(self, display):
            self.d = display

            # Find which screen to open the window on
            self.screen = self.d.screen()

            # background pattern
            bgsize = 20

            bgpm = self.screen.root.create_pixmap(
                bgsize,
                bgsize,
                self.screen.root_depth
                )

            bggc = self.screen.root.create_gc(
                foreground=self.screen.black_pixel,
                background=self.screen.black_pixel
                )

            bgpm.fill_rectangle(bggc, 0, 0, bgsize, bgsize)

            bggc.change(foreground=self.screen.white_pixel)

            bgpm.arc(bggc, -bgsize // 2, 0, bgsize, bgsize, 0, 360 * 64)
            bgpm.arc(bggc, bgsize // 2, 0, bgsize, bgsize, 0, 360 * 64)
            bgpm.arc(bggc, 0, -bgsize // 2, bgsize, bgsize, 0, 360 * 64)
            bgpm.arc(bggc, 0, bgsize // 2, bgsize, bgsize, 0, 360 * 64)

           # Actual window
            self.window = self.screen.root.create_window(
                100, 100, 400, 300, 0,
                self.screen.root_depth,
                X.InputOutput,
                X.CopyFromParent,

                # special attribute values
                background_pixmap=bgpm,
                event_mask=(
                    X.StructureNotifyMask |
                    X.ButtonReleaseMask
                    ),
                colormap=X.CopyFromParent
                )

            # Set some WM info

            self.WM_DELETE_WINDOW = self.d.intern_atom('WM_DELETE_WINDOW')
            self.WM_PROTOCOLS = self.d.intern_atom('WM_PROTOCOLS')

            self.window.set_wm_name('Xlib example: childwin.py')
            self.window.set_wm_icon_name('childwin.py')
            self.window.set_wm_class('childwin', 'XlibExample')

            self.window.set_wm_protocols([self.WM_DELETE_WINDOW])
            self.window.set_wm_hints(
                flags=Xutil.StateHint,
                initial_state=Xutil.NormalState
                )

            self.window.set_wm_normal_hints(
                flags=(Xutil.PPosition | Xutil.PSize | Xutil.PMinSize),
                min_width=50,
                min_height=50
                )

            # Map the window, making it visible
            self.window.map()

            # Child window
            (self.childWidth, self.childHeight) = (20, 20)
            self.childWindow = self.window.create_window(
                20, 20, self.childWidth, self.childHeight, 0,
                self.screen.root_depth,
                X.CopyFromParent,
                X.CopyFromParent,

                # special attribute values
                background_pixel=self.screen.white_pixel,
                colormap=X.CopyFromParent,
                )
            self.childWindow.map()


        # Main loop, handling events
        def loop(self):
            current = None
            while 1:
                e = self.d.next_event()

                # Window has been destroyed, quit
                if e.type == X.DestroyNotify:
                    sys.exit(0)

                # Button released, add or subtract
                elif e.type == X.ButtonRelease:
                    if e.detail == 1:
                        print("Moving child window.")
                        self.childWindow.configure(
                            x=e.event_x - self.childWidth // 2,
                            y=e.event_y - self.childHeight // 2
                            )
                        self.d.flush()

                # Somebody wants to tell us something
                elif e.type == X.ClientMessage:
                    if e.client_type == self.WM_PROTOCOLS:
                        fmt, data = e.data
                        if fmt == 32 and data[0] == self.WM_DELETE_WINDOW:
                            sys.exit(0)


    if __name__ == '__main__':
        Window(display.Display()).loop()

xlib_test()

因为最后一行xlib_test(),如果我通过输入

运行此文件
python childtest.py

在终端中,程序正常工作并出现一个窗口。但是,如果我打开python解释器,导入该函数然后运行它,

from childtest import xlib_test
xlib_test()

没有窗口显示,因此Xlib函数似乎不起作用。是否有人能够解释这种行为以及如何纠正我的设置以解决它?我的目标是将我的Xlib函数编写在一个单独的文件中,并在我的主代码中导入这些函数。

1 个答案:

答案 0 :(得分:0)

这是正常的,这是因为这一行:

if __name__ == '__main__':