Как обновить WindowText в Python несколько раз? - PullRequest
0 голосов
/ 19 февраля 2019

Я искал код, чтобы помочь решить эту проблему.вот лучший ответ, который я смог найти ниже.

import win32api
import win32con
import win32gui
import time
import threading

#Code example modified from:
#Christophe Keller
#Hello World in Python using Win32

# New code: Define global
windowText = 'Hello send by Python via Win32!'

def main():
    #get instance handle
    hInstance = win32api.GetModuleHandle()

    # the class name
    className = 'SimpleWin32'

    # create and initialize window class
    wndClass                = win32gui.WNDCLASS()
    wndClass.style          = win32con.CS_HREDRAW | win32con.CS_VREDRAW
    wndClass.lpfnWndProc    = wndProc
    wndClass.hInstance      = hInstance
    wndClass.hIcon          = win32gui.LoadIcon(0, win32con.IDI_APPLICATION)
    wndClass.hCursor        = win32gui.LoadCursor(0, win32con.IDC_ARROW)
    wndClass.hbrBackground  = win32gui.GetStockObject(win32con.WHITE_BRUSH)
    wndClass.lpszClassName  = className

    # register window class
    wndClassAtom = None
    try:
        wndClassAtom = win32gui.RegisterClass(wndClass)
    except Exception as e:
        print (e)
        raise e

    hWindow = win32gui.CreateWindow(
        wndClassAtom,                   #it seems message dispatching only works with the atom, not the class name
        'Python Win32 Window',
        win32con.WS_OVERLAPPEDWINDOW,
        win32con.CW_USEDEFAULT,
        win32con.CW_USEDEFAULT,
        win32con.CW_USEDEFAULT,
        win32con.CW_USEDEFAULT,
        0,
        0,
        hInstance,
        None)

    # Show & update the window
    win32gui.ShowWindow(hWindow, win32con.SW_SHOWNORMAL)
    win32gui.UpdateWindow(hWindow)

    # New code: Create and start the thread
    thr = threading.Thread(target=customDraw, args=(hWindow,))
    thr.setDaemon(False)
    thr.start()

    # Dispatch messages
    win32gui.PumpMessages()


# New code: Attempt to change the text 1 second later
def customDraw(hWindow):
    global windowText
    time.sleep(1.0)
    windowText = 'Something new'
    win32gui.RedrawWindow(hWindow, None, None, win32con.RDW_INVALIDATE | win32con.RDW_ERASE)


def wndProc(hWnd, message, wParam, lParam):

    if message == win32con.WM_PAINT:
        hDC, paintStruct = win32gui.BeginPaint(hWnd)

        rect = win32gui.GetClientRect(hWnd)
        win32gui.DrawText(
            hDC,
            windowText,
            -1,
            rect,
            win32con.DT_SINGLELINE | win32con.DT_CENTER | win32con.DT_VCENTER)

        win32gui.EndPaint(hWnd, paintStruct)
        return 0

    elif message == win32con.WM_DESTROY:
        print('Being destroyed')
        win32gui.PostQuitMessage(0)
        return 0

    else:
        return win32gui.DefWindowProc(hWnd, message, wParam, lParam)

if __name__ == '__main__':
    main()

к сожалению, вывод «Hello send by Python через Win32!»а потом "что-то новое"

это хорошее начало, но мне нужно "что-то новое", чтобы обновить до "что-то новое 2" и "что-то новое 3" и т. д.

есть ли я в любом случае могуотобразить «что-то новое 2» и «что-то новое 3» и т. д. из текстового файла, содержащего «что-то новое», «что-то новое 2», «что-то новое 3» и т. д.

обновление «windowText =что-то новое "было бы очень долго, если бы мне приходилось вводить это снова и снова, поэтому, возможно, было бы лучше отображать строку текстового файла одну за другой.

, поэтому мой вопрос заключается в том, как я могу отображать текстиз текстового файла по одной строке за раз как «что-то новое»

или как я могу легко отобразить «что-то новое 2», «что-то новое 3» и т. д., используя текущий код?

1 Ответ

0 голосов
/ 21 февраля 2019

Используйте SetTimer вместо создания дополнительных потоков.Пример:

import win32api, win32con, win32gui
import timer

windowText = 'Hello send by Python via Win32!'
hWindow = 0

def main():
    hInstance = win32api.GetModuleHandle()
    className = 'SimpleWin32'

    wndClass                = win32gui.WNDCLASS()
    wndClass.style          = win32con.CS_HREDRAW | win32con.CS_VREDRAW
    wndClass.lpfnWndProc    = wndProc
    wndClass.hInstance      = hInstance
    wndClass.hIcon          = win32gui.LoadIcon(0, win32con.IDI_APPLICATION)
    wndClass.hCursor        = win32gui.LoadCursor(0, win32con.IDC_ARROW)
    wndClass.hbrBackground  = win32gui.GetStockObject(win32con.WHITE_BRUSH)
    wndClass.lpszClassName  = className
    wndClassAtom = win32gui.RegisterClass(wndClass)

    hWindow = win32gui.CreateWindow(wndClassAtom,                   
        'Python Win32 Window',
        win32con.WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, 0, 0, hInstance, None)

    win32gui.ShowWindow(hWindow, win32con.SW_SHOWNORMAL)
    win32gui.UpdateWindow(hWindow)
    timer.set_timer(1000, customDraw)
    win32gui.PumpMessages()

counter = 0
def customDraw(timer_id, time):
    global hWindow
    global counter
    global windowText
    if counter > 2:
        counter = 0
    text = ["test 0", "test 1", "test 2"]
    windowText = text[counter]
    counter = counter + 1
    win32gui.InvalidateRect(hWindow, None, True)

def wndProc(hWnd, message, wParam, lParam):
    if message == win32con.WM_PAINT:
        hDC, paintStruct = win32gui.BeginPaint(hWnd)
        rect = win32gui.GetClientRect(hWnd)
        win32gui.DrawText(hDC, windowText, -1, rect,
            win32con.DT_SINGLELINE | win32con.DT_CENTER | win32con.DT_VCENTER)
        win32gui.EndPaint(hWnd, paintStruct)
        return 0

    elif message == win32con.WM_DESTROY:
        print('Being destroyed')
        win32gui.PostQuitMessage(0)
        return 0

    else:
        return win32gui.DefWindowProc(hWnd, message, wParam, lParam)

if __name__ == '__main__':
    main()
...