2009-12-12 29 views

Trả lời

47

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.

+2

Đã thử .lift() trên máy Mac 10.9 không hoạt động. – shawn

+2

đ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

+1

hoạt động trong Windows 7 – Aftershock

27

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' ''') 
+2

hoạt động trên mac 10.9 – shawn

+1

Hoạt động hoàn hảo trên Mavericks. Cảm ơn nhiều. – edsonlp1

+2

Cần phải xảy ra trước root.mainloop() – Joris

5

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''') 
2

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) 
+0

khi đóng cửa sổ, có lỗi: Lỗi phân đoạn: 11 – metaphy

+0

Nó chạy trong ứng dụng Tkinter ở đây mà không bị phân đoạn trên 10.10.2 với python hệ thống. Hãy thử xóa các phần khác của mã của bạn, có thể đó là một phần khác đang bị lỗi. – MagerValp

4

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() 
+0

ngôn ngữ lập trình nào là ngôn ngữ này – zavr

+0

Ngôn ngữ là Python –

+0

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. –

12

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.

+1

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

4

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() 
0

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.

Các vấn đề liên quan