Использование расширений TCL для установки собственного стиля окна в Tkinter - PullRequest
4 голосов
/ 22 июля 2010

pythonware.com / library / tkinter / вводная /… документирует метод переопределенных прямых, который удаляет заголовок и границу, если этого недостаточно, вы должны установить собственный стиль окна, я не уверен, что Tkinter дает вамтакого рода низкоуровневый доступ, если нет, попробуйте что-то вроде twapi.magicsplat.com/ui.html#set_window_style TCL расширение

В предыдущем посте я получил это как ответ о том, какполучить границу в Tkinter, подобную изображенной ниже.Я не знаком с Tcl и его расширениями.Так как же это сделать?Конечная цель - получить границу ниже в окне Tkinter.

альтернативный текст http://i30.tinypic.com/69jm2a.png

Редактировать:

Я использовал следующее в Windows 7, и это, похоже, не изменило стиль.Вероятно, что-то упустил.Любая помощь будет оценена, это может быть очень здорово!

import string, win32ui, win32con
import Tkinter as tk

root = tk.Tk()

frame = win32ui.CreateWindowFromHandle(string.atoi(root.wm_frame(), 0))
frame.ModifyStyle(win32con.WS_CAPTION, 0, win32con.SWP_FRAMECHANGED)

root.mainloop()

Ответы [ 2 ]

4 голосов
/ 16 августа 2011

Вы можете сделать это, используя комбинацию Python Win32 API-пакетов и Tkinter. Что вам нужно знать, так это то, что окно Tk является клиентским разделом окна Win32. Взаимодействия оконного менеджера обрабатываются с помощью оболочки, которая является родителем самого окна Tk. Если у вас есть окно Tkinter 'w', вы можете создать окно PyWin32 для фрейма или просто манипулировать им напрямую. Вы можете получить кадр hwnd, используя w.wm_frame () и анализируя возвращенную шестнадцатеричную строку или используя GetParent для значения winfo_id из окна Tk (хотя wm_frame, вероятно, будет более надежным).

import string, win32ui, win32con
from Tkinter import *
w = Tk()
frame = win32ui.CreateWindowFromHandle(string.atoi(w.wm_frame(), 0))
frame.ModifyStyle(win32con.WS_CAPTION, 0, win32con.SWP_FRAMECHANGED)

Это удаляет стиль WS_CAPTION и уведомляет окно о том, что его кадр изменен, что вызывает пересчет геометрии, чтобы изменение распространялось на дочернее окно Tk.

РЕДАКТИРОВАТЬ --- Следующие меры гарантируют, что мы изменим стиль окна после , когда окно было полностью создано и отображено на дисплее.

import string, win32ui, win32con
from Tkinter import *

def decaption(event):
    w = event.widget
    frame = win32ui.CreateWindowFromHandle(string.atoi(w.wm_frame(), 0))
    frame.ModifyStyle(win32con.WS_CAPTION, 0, win32con.SWP_FRAMECHANGED)
    w.bind("<Map>", None)

root = Tk()
root.bind("<Map>", decaption)
root.mainloop()
2 голосов
/ 16 августа 2011

Одно из решений - нарисовать собственную границу.Используйте overrideredirect для удаления всех декораций, сетки / упаковки / размещения холста, который заполняет окно, затем рисуйте или используйте растровые изображения, чтобы получить нужный визуальный эффект.Вы должны будете добавить свои собственные привязки для перемещения и изменения размера окна, но это не так уж сложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...