Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2011-11-04

В следующий раз поставлю Linux

Было у меня желание, раз уж приходится мудохаться с напильником вокруг Вин7, то чего бы не поставить Дебианчик и дотачивать его. Все пользы больше. Но не поддался слабости, доточил свой movieshell (исходники прилагаются) под Windows7. Узнал много нового, что полезно. Но в следующий раз наверняка поставлю Linux.

К чему это я? Это я про то, как программулина, написанная на Python + Tkinter и отлаженная на Windows XP, оказалась практически неработоспособна на Windows7. Потому как злые люди поменяли поведение виндовых подсистем. Раньше работало так, а теперь иначе.

Короче, доточил. А главное, я решил вопрос с максимизацией окна! Облазил полтырнету, нигде нет рабочего рецепта «как вызвать maximize у окна нарисованного Tkinter». Пришлось сперва использовать конструкцию вида:
w, h = tk.winfo_screenwidth(), tk.winfo_screenheight()
tk.geometry("%dx%d+0+0" % (w-100, h-100))
Что нехорошо, ибо на экране полно всяких панелек, сокращающих доступную окну площадь.

Перебрав с два десятка вариантов, я нашел рабочий. Вот:
def doWork(self):
  print 'listMovies.doWork'
  self.tk.iconify()
  self.tk.update()
  self.tk.deiconify()
  self.tk.after(500, self.maximizeWindow)
  self.tk.mainloop()

def maximizeWindow(self):
''' use winapi
SendMessage(hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
PostMessage - is async wersion of SendMessage
'''
  print 'listMovies.maximizeWindow'
  try:
    import string, win32con, win32gui
    w = self.tk
    sh = w.wm_frame() # var type [<type 'str'>], var value ['0x180116']
    h = string.atoi(sh, 0)
    win32gui.PostMessage(h, win32con.WM_SYSCOMMAND, win32con.SC_MAXIMIZE, 0)
  except Exception, e:
    if type(e).__name__ == 'COMError': print 'COM Error, msg [%s]' % e
  else:
    print "can't maximize window"
    import traceback
    traceback.print_exc(file=sys.stderr)
Применяемый в коде self.tk это не что иное, как результат вызова Tkinter.Tk(), что обычно в примерах называют root. Вызов «tk.after» нужен для срабатывания максимайза после завершения инициализации окна. И еще, при использовании SendMessage оно тоже работает, но только не в Вин7. В семерке необходимо использовать асинхрон — PostMessage.


Сцылки по теме
vasnake.blogspot.com/2010/12/magnate
sites.google.com/site/vasnake
vasnake.blogspot.com/2010/12/blog-post_29
vasnake.blogspot.com/2011/10/blog-post_24
vasnake.blogspot.com/2011/10/getlogicaldrives

1 комментарий:

  1. Нашлось нормальное решение задачи, см.
    http://vasnake.blogspot.com/2012/04/maximized-window.html

    if sys.platform != 'linux2':
    root.wm_state('zoomed')
    else:
    root.wm_attributes('-zoomed', True)

    ОтветитьУдалить

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) Klaipeda (14) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)