Làm cách nào để tải ứng dụng Tkinter lên phía trước? Hiện tại, cửa sổ xuất hiện phía sau tất cả các cửa sổ khác của tôi và không lấy nét.Làm thế nào để làm cho một cửa sổ Tkinter nhảy lên phía trước?
Có phương pháp nào tôi nên gọi không?
Làm cách nào để tải ứng dụng Tkinter lên phía trước? Hiện tại, cửa sổ xuất hiện phía sau tất cả các cửa sổ khác của tôi và không lấy nét.Làm thế nào để làm cho một cửa sổ Tkinter nhảy lên phía trước?
Có phương pháp nào tôi nên gọi không?
Giả sử bạn có nghĩa là cửa sổ ứng dụng của bạn khi bạn nói "các cửa sổ khác của tôi", bạn có thể sử dụng phương pháp lift()
trên mục cấp đầu hoặc Tk:
root.lift()
Nếu bạn muốn cửa sổ để ở lại trên tất cả các cửa sổ khác, sử dụng:
root.attributes("-topmost", True)
Trường hợp root
là Toplevel hoặc Tk của bạn. Đừng quên -
infront của "topmost"
!
Để làm cho nó tạm, vô hiệu hóa trên cùng ngay sau:
def raise_above_all(window):
window.attributes('-topmost', 1)
window.attributes('-topmost', 0)
Chỉ cần vượt qua trong cửa sổ bạn muốn nâng cao như một đối số, và điều này sẽ làm việc.
Nếu bạn đang thực hiện việc này trên máy Mac, hãy sử dụng AppleEvents để tập trung vào Python. Ví dụ:
import os
os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''')
Về máy Mac, tôi nhận thấy có vấn đề trong đó nếu có nhiều GUI python chạy, mọi quá trình sẽ được đặt tên là "Python" và AppleScript sẽ có xu hướng quảng bá sai . Đây là giải pháp của tôi. Ý tưởng là lấy danh sách các ID tiến trình đang chạy trước và sau khi bạn tải Tkinter. (Lưu ý rằng đây là những ID quá trình AppleScript mà dường như không có liên quan đến các đối tác posix của chúng. Hãy xem hình.) Sau đó, người đàn ông kỳ lạ sẽ là của bạn và bạn di chuyển cái đó đến tận cùng. (Tôi đã không nghĩ rằng vòng lặp ở cuối sẽ là cần thiết, nhưng nếu bạn chỉ đơn giản là có được tất cả các quá trình có ID là procID, AppleScript dường như trả về một đối tượng được xác định theo tên, mà tất nhiên là không độc đáo "Python", vì vậy chúng tôi đang trở lại một hình vuông, trừ khi có một cái gì đó tôi là thiếu)
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''')
Trên Mac OS X PyObjC cung cấp một trình dọn dẹp và ít lỗi phương pháp dễ hơn bắn phá ra để osascript:.
import os
from Cocoa import NSRunningApplication, NSApplicationActivateIgnoringOtherApps
app = NSRunningApplication.runningApplicationWithProcessIdentifier_(os.getpid())
app.activateWithOptions_(NSApplicationActivateIgnoringOtherApps)
Gần đây, Tôi có cùng một câu hỏi trên Mac. Tôi đã kết hợp một vài câu trả lời bằng @MagerValp
dành cho Mac và @D K
cho các hệ thống khác:
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()
ngôn ngữ lập trình nào là ngôn ngữ này – zavr
Ngôn ngữ là Python –
Thêm và xóa '-topmost' đã làm việc cho tôi trên Sierra, không giống như nhánh khác (không có mô-đun Cocoa trong đó). Tôi đang chạy tk mặc định OS X. –
Thêm các dòng sau đây trước khi mainloop():
root.lift()
root.attributes('-topmost',True)
root.after_idle(root.attributes,'-topmost',False)
Nó hoạt động hoàn hảo cho tôi. Nó làm cho cửa sổ đến phía trước khi cửa sổ được tạo ra, và nó sẽ không giữ nó luôn ở phía trước.
Tôi đang chạy 10,11 Và đây là câu trả lời duy nhất làm việc cho tôi. – user1247
Hơi có sự kết hợp của nhiều phương pháp khác, điều này hoạt động trên OS X 10.11 và Python 3.5.1 chạy trong venvà cũng nên hoạt động trên các nền tảng khác. Nó cũng nhắm mục tiêu ứng dụng theo id quá trình thay vì tên ứng dụng.
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))
Bạn gọi nó là ngay trước khi mainloop()
cuộc gọi, như vậy:
raise_app(root)
root.mainloop()
Có một gợi ý về cách làm cho các cửa sổ Tkinter mất tập trung khi bạn gọi mainloop() trong Tkinter._test () chức năng.
# The following three commands are needed so the window pops
# up on top on Windows...
root.iconify()
root.update()
root.deiconify()
root.mainloop()
Đây là cách sạch nhất mà tôi đã tìm thấy, nhưng nó chỉ cần thiết cho hệ thống Windows.
Đã thử .lift() trên máy Mac 10.9 không hoạt động. – shawn
điều tôi muốn nói là: các cửa sổ. Các thuộc tính (1) mang lại phía trước, nhưng (0) dường như không tắt nó. Nó thực sự gửi nó về phía sau. – shawn
hoạt động trong Windows 7 – Aftershock