2009-12-12 16 views

cevap

47

Bir toplevel veya Tk üzerinde lift() yöntemi kullanabilirsiniz, siz "benim diğer pencereler" derken başvurunuzun pencereleri anlamına varsayarsak:

root.lift() 

Eğer pencere tüm diğer pencerelerin üzerinde kalmak istiyorsanız

, Kullanım: root sizin toplevel veya Tk ise

root.attributes("-topmost", True) 

. "topmost"'un önündeki -'u unutmayın!

sonra geçici, en üstteki hakkı devre dışı yapmak için:

def raise_above_all(window): 
    window.attributes('-topmost', 1) 
    window.attributes('-topmost', 0) 

Tıpkı bir argüman olarak yükseltmek istiyorum pencerede geçmek ve bu çalışması gerekir.

+2

Çalıştırılmadı. – shawn

+2

söylemek istediğim: windows.attributes (1) önüne getiriyor, ancak (0) devre dışı bırakıyor gibi görünmüyor. Aslında onu arkaya gönderir. – shawn

+1

, Windows 7'de çalışır – Aftershock

27

Mac'te bunu yapıyorsanız, Python'a odaklanmak için AppleEvents kullanın. Ör: Mac İlişkin

import os 

os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''') 
+2

, Mac üzerinde çalışır. 109 – shawn

+1

Mavericks'de mükemmel çalışır. Çok teşekkür ederim. – edsonlp1

+2

Kökten önce gerçekleşmesi gerekiyor.mainloop() – Joris

5

, ben çalışan birden piton GUI varsa bunda bir sorun olabilir fark, her işlemin belirtilen "Python" ve AppleScript ön yanlış bir teşvik etmek eğiliminde olacaktır edilecek . İşte benim çözümüm. Buradaki fikir, Tkinter'i yüklemeden önce ve sonra çalışan işlem kimlikleri listesi almaktır. (Bunların, posix muadilleriyle hiçbir ilgisi yok gibi görünen AppleScript işlem kimlikleri olduğunu unutmayın. Git şekil.) Sonra garip adam senin olacak ve sen onu en ileriye taşıyacaksın. (Sonunda bu döngünün gerekli olacağını düşünmüyordum, ama eğer kimliği doğru olan her süreci alırsanız, AppleScript görünüşe göre isimle tanımlanan tek bir nesneyi döndürür, ki bu elbette ki bu benzersiz olmayan "Python" dur. biz silbaştan ben eksik bir şey var olmadıkça için vardır), Mac OS X PyObjC On

import Tkinter, subprocess 
def applescript(script): 
    return subprocess.check_output(['/usr/bin/osascript', '-e', script]) 
def procidset(): 
    return set(applescript(
     'tell app "System Events" to return id of every process whose name is "Python"' 
     ).replace(',','').split()) 
idset = procidset() 
root = Tkinter.Tk() 
procid = iter(procidset() - idset).next() 
applescript(''' 
    tell app "System Events" 
     repeat with proc in every process whose name is "Python" 
      if id of proc is ''' + procid + ''' then 
       set frontmost of proc to true 
       exit repeat 
      end if 
     end repeat 
    end tell''') 
2

osascript için ateşinin daha daha temiz ve daha az hata eğilimli bir yöntem sunar:. son

import os 
from Cocoa import NSRunningApplication, NSApplicationActivateIgnoringOtherApps 

app = NSRunningApplication.runningApplicationWithProcessIdentifier_(os.getpid()) 
app.activateWithOptions_(NSApplicationActivateIgnoringOtherApps) 
+0

Pencereyi kapatırken bir hata var: Segmentasyon hatası: 11 – metaphy

+0

Burada bir Tkinter uygulamasında 10.10.2'de sistem python'unda segfaulting olmadan çalışır. Kodunuzun diğer bölümlerini kaldırmayı deneyin, büyük olasılıkla başka bir şey çöküyor. – MagerValp

4

, Mac’de de aynı soru vardı. Ben diğer sistemler için Mac için @MagerValp ve @D K kullanarak çeşitli cevaplar birleştirdik:

import platform 

if platform.system() != 'Darwin': 
    root.lift() 
    root.call('wm', 'attributes', '.', '-topmost', True) 
    root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False) 
else: 
    import os 
    from Cocoa import NSRunningApplication, NSApplicationActivateIgnoringOtherApps 

    app = NSRunningApplication.runningApplicationWithProcessIdentifier_(os.getpid()) 
    app.activateWithOptions_(NSApplicationActivateIgnoringOtherApps) 

root.mainloop() 
+0

hangi programlama dili bu – zavr

+0

Bu dil Python –

+0

Diğeri (Sierra-Coğrafya modülü yok) diğer daldan farklı olarak Sierra'da benim için çalıştım ve kaldırılıyor. Bir OS X varsayılan tk çalıştırıyorum. –

12

mainloop() önce aşağıdaki satırları ekleyin: Bu benim için mükemmel çalışıyor

root.lift() 
root.attributes('-topmost',True) 
root.after_idle(root.attributes,'-topmost',False) 

. Pencere oluşturulduğunda pencerenin önüne geçmesini sağlar ve her zaman ön tarafta olmayacaktır.

+1

10.11 çalışıyorum ve bu benim için çalışan tek cevap. – user1247

4

Diğer çeşitli yöntemlerin bir bileşimi olan bu, OS X 10.11 ve Python 3.5.1 üzerinde çalışıyor ve başka platformlarda da çalışmalıdır. Uygulama, uygulama adı yerine işlem kimliğine göre de hedefler.

from tkinter import Tk 
import os 
import subprocess 
import platform 


def raise_app(root: Tk): 
    root.attributes("-topmost", True) 
    if platform.system() == 'Darwin': 
     tmpl = 'tell application "System Events" to set frontmost of every process whose unix id is {} to true' 
     script = tmpl.format(os.getpid()) 
     output = subprocess.check_call(['/usr/bin/osascript', '-e', script]) 
    root.after(0, lambda: root.attributes("-topmost", False)) 

Öyle gibi sağ mainloop() aramadan önce diyoruz: Eğer Tkinter._test içinde mainloop() çağırdığınızda Tkinter pencere almak odağı yapmak için nasıl bir ipucu (var

raise_app(root) 
root.mainloop() 
0

) işlevi.

# The following three commands are needed so the window pops 
# up on top on Windows... 
root.iconify() 
root.update() 
root.deiconify() 
root.mainloop() 

Bunu yapmak için bulduğum en temiz en uygun yoldur, ancak yalnızca Windows sistemleri için gereklidir.

İlgili konular