Tôi đang nghĩ để tạo một thanh tiến trình với python trong terminal. Đầu tiên, tôi phải lấy chiều rộng (cột) của cửa sổ đầu cuối. Trong python 2.7, không có thư viện chuẩn nào có thể thực hiện điều này trên Windows. Tôi biết có lẽ tôi phải gọi Windows API API theo cách thủ công.Tại sao mã không liên quan tạo nên sự khác biệt?
Theo MSDN và Python Tài liệu, tôi đã viết đoạn mã sau:
import ctypes
import ctypes.wintypes
class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
_fields_ = [
('dwSize', ctypes.wintypes._COORD),
('dwCursorPosition', ctypes.wintypes._COORD),
('wAttributes', ctypes.c_ushort),
('srWindow', ctypes.wintypes._SMALL_RECT),
('dwMaximumWindowSize', ctypes.wintypes._COORD)
]
hstd = ctypes.windll.kernel32.GetStdHandle(ctypes.c_ulong(-11)) # STD_OUTPUT_HANDLE = -11
print hstd
csbi = CONSOLE_SCREEN_BUFFER_INFO()
print ctypes.sizeof(csbi) # <---------------
ret = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(ctypes.c_ulong(hstd), csbi)
print ret
print csbi.dwSize.X
Nó hoạt động tốt. Tôi đã đặt xóa một số mã print
. Nhưng sau đó, nó không hoạt động! GetLastError
trả lại 6 (Xử lý không hợp lệ). Sau nhiều lần cố gắng, tôi thấy rằng phải có SOMETHING ở vị trí được chỉ định của mã như print 'hello'
, import sys
hoặc sys.stdout.flush()
. Lúc đầu, tôi đoán rằng có lẽ nó cần thời gian để làm điều gì đó. Vì vậy, tôi đã cố gắng để đặt time.sleep(2)
tại vị trí đó, nhưng nó vẫn không hoạt động.
Nhưng, nếu tôi sử dụng struct
thay vì ctypes.Structure
, không có vấn đề như vậy.
import ctypes
import struct
hstd = ctypes.windll.kernel32.GetStdHandle(-11) # STD_OUTPUT_HANDLE = -11
csbi = ctypes.create_string_buffer(22)
res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(hstd, csbi)
width, height, curx, cury, wattr, left, top, right, bottom, maxx, maxy = struct.unpack("hhhhHhhhhhh", csbi.raw)
print bufx
Có ai có thể cho tôi biết lý do mã không liên quan tạo sự khác biệt như vậy không?
Để sử dụng 'GetLastError' đáng tin cậy từ Python, hãy sử dụng' kernel32 = ctypes.WinDLL ('kernel32', use_last_error = True) 'và sau đó gọi' ctypes.get_last_error'. – eryksun