2012-01-01 39 views
14

Tôi đang sử dụng Python 2 với TkinterPyObjC, sau đó tôi đang sử dụng py2app.Làm thế nào để đặt một cửa sổ tkinter trên đầu trang của những người khác?

Chương trình hoạt động tốt, nhưng cửa sổ bắt đầu ẩn khi nào tôi mở chương trình, vì vậy nó không xuất hiện cho đến khi tôi nhấp vào biểu tượng trên đế để hiển thị.

Có cách nào để kiểm soát điều này không, làm cho cửa sổ ở trên cùng của các cửa sổ khác được mở khi ứng dụng đang khởi động?

Chỉ cần làm rõ, nó không nhất thiết phải ở trên cùng trong suốt thời gian ứng dụng đang chạy. Tôi chỉ cần nó để được trên đầu trang của các cửa sổ khác khi nó bắt đầu.

+1

Sao chép có thể có của [Làm cách nào để tạo cửa sổ nhảy lên phía trước?] (http://stackoverflow.com/câu hỏi/1892339/cách thực hiện-một-cửa sổ-nhảy-tới-mặt-trước) –

Trả lời

10

Nhược bằng tôi lấy mã bạn đưa ra và thêm dòng đầu tiên và cuối cùng bạn nhận được:

from tkinter import * 

root = Tk() 
root.title("app") 
screen_width = root.winfo_screenwidth() 
screen_height = root.winfo_screenheight() 
root.geometry("550x250+%d+%d" % (screen_width/2-275, screen_height/2-125)) 
root.configure(background='gold') 
root.lift() 

mainloop() 

thử nghiệm nó. Tôi nhận được cửa sổ như mong đợi. Bạn có cái gì khác không? Nếu điều này làm việc sau đó một nơi nào đó trong mã bạn đang nói với nó để làm điều đó. Nếu nó làm điều tương tự như chương trình thực của bạn thì trình quản lý cửa sổ của bạn đang thực hiện nó. Đây là điều tốt nhất tôi có thể làm mà không cần thêm thông tin.

Edit:

Ngày OSX (espicially phiên bản sử dụng thủy) cửa sổ Tkinter của thể được hiển thị phía sau những người đã mở (điều này có một báo cáo lỗi ở đây: http://bugs.python.org/issue9384 nhưng đã bị đóng cửa như sẽ không sửa chữa). Việc bổ sung lệnh root.lift() đã được đưa vào để đưa cửa sổ lên trước ngăn xếp trong những trường hợp đó và vô hại trong tất cả các trường hợp khác.

+0

Tôi đã nhận nó được giải quyết. Đó là vì mã của tôi có dấu chấm (".") Trong tên tệp của nó. Khi tôi loại bỏ khoảng thời gian từ tên tập tin, cửa sổ xuất hiện trên đầu trang tốt, mặc dù tôi không chắc chắn chúng liên quan như thế nào. Dù sao cũng cảm ơn bạn! – Dennis

+0

Rất vui được phục vụ. :) – vdbuilder

+0

Trên thực tế, hiện tại nó không hiển thị trên đầu một lần nữa. Tôi không có ý tưởng tại sao nó đi qua lại, nhưng tôi đoán rằng có gì đó sai với người quản lý cửa sổ, rõ ràng là vì nó làm điều đó khi tôi thậm chí không thay đổi bất cứ điều gì trong mã. Có cách nào để buộc cửa sổ ở trên cùng với PyObjC không? Tôi đã tìm kiếm nhưng chưa có câu trả lời hay nào ... @vdbuilder – Dennis

15

Tôi đã gặp vấn đề tương tự ngay hôm nay. OSX LION 10.7.2. Thêm mã này trước khi mainloop() giải quyết vấn đề.

root.call('wm', 'attributes', '.', '-topmost', '1') 

nhưng cửa sổ luôn ở trên đầu những người khác cho đến khi bạn đóng. Để giải quyết thực sự, chúng ta cần biến nó thành một gói ứng dụng, với py2app.

3

Tôi đã sửa đổi giải pháp trên và 2 dòng này hoạt động với tôi trên OSX. Nó mang cửa sổ về phía trước, nhưng không làm cửa sổ hoạt động như Always on Top.

root.call('wm', 'attributes', '.', '-topmost', True) 
root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False) 
+1

Không hoạt động trong Mac OS 10.11.2. Bạn cần 'root.lift()', như trong câu trả lời của @ jjaderberg – George

11

Đối với OS X 10.8.3, sự kết hợp của các câu trả lời được cung cấp bởi vdbuilder và user2435139 đã làm các trick cho tôi, tức là

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

gọi trước khi

self.root.mainloop() 
+0

làm việc cho tôi ở Sierra nhờ – jamescampbell

5

hơn cho mac Người dùng hệ điều hành. Mặc dù các giải pháp trên dường như hiển thị chính xác, ứng dụng vẫn được đặt ở "cuối ngăn xếp" từ quan điểm của Người tìm. Như có thể thấy với bộ chuyển đổi Cmd+Tab, hoặc đơn giản là quan sát rằng con trăn không lấy nét.

Giải pháp từ username sửa chữa tất cả (một lần nữa, cho mac OS):

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

lẽ bao quanh rằng với một cái gì đó giống như

import platform 
if "Darwin" in platform.system(): 
    # apply fix 
+0

Thực ra Mặc dù vậy, chúng có thể có nhiều lợi ích hơn trên các nền tảng khác so với OS X, chưa thử, xin cám ơn! – yair

0

Các osascript trick Arnaud P có thể có vấn đề, nếu có nhiều hơn một quá trình với tiêu đề ứng dụng 'Python'; thêm vào đó, nó sẽ không làm việc cho Python 3 quá trình (cần phải được gọi là 'Python3' sau đó.

Tuy nhiên, tôi thấy another trick rằng có thể giải quyết vấn đề bằng cách sử dụng quá trình id.

import os 
script = 'tell application "System Events" \ 
    to set frontmost of the first process whose unix id is {pid} to true'.format(pid=os.getpid()) 
os.system("/usr/bin/osascript -e '{script}'".format(script=script)) 
4

Tôi biết điều này là một câu hỏi cũ nhưng tôi thấy kỳ lạ là không ai tìm ra giải pháp đơn giản mà tôi có,

app = SampleApp() 

app.attributes('-topmost', True) 
app.update() 
app.attributes('-topmost', False) 

app.mainloop() 
+2

Đây là câu trả lời hay nhất (hoạt động tốt trên osx). Ank bạn. –

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