Önden atlamak için bir Tkinter uygulaması nasıl alabilirim? Şu anda, pencere diğer tüm pencerelerin arkasında görünür ve odaklanma elde edemez.Tkinter penceresi ön tarafa nasıl atlanır?
Aramam gereken bir yöntem var mı?
Önden atlamak için bir Tkinter uygulaması nasıl alabilirim? Şu anda, pencere diğer tüm pencerelerin arkasında görünür ve odaklanma elde edemez.Tkinter penceresi ön tarafa nasıl atlanır?
Aramam gereken bir yöntem var mı?
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.
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' ''')
, 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''')
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)
, 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()
hangi programlama dili bu – zavr
Bu dil Python –
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. –
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.
10.11 çalışıyorum ve bu benim için çalışan tek cevap. – user1247
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()
) 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.
Çalıştırılmadı. – shawn
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
, Windows 7'de çalışır – Aftershock