Как сделать окно полноэкранным на дополнительном дисплее с помощью tkinter?

Я знаю, как сделать окно полноэкранным на «основном» дисплее, но даже при перемещении окна моего приложения на дополнительный дисплей, подключенный к моему ПК, когда я звоню:

self.master.attributes('-fullscreen', True)

в полноэкранном режиме это окно делается на «основном» дисплее, а не на дополнительном (окно приложения исчезает с дополнительного дисплея и сразу же появляется на «основном» в полноэкранном режиме).

Как я могу сделать его полноэкранным на дополнительном дисплее?


person Justino Rodrigues    schedule 09.10.2014    source источник
comment
Окна? или что-то другое?   -  person Terry Jan Reedy    schedule 10.10.2014
comment
Просто Windows... Tk() или Toplevel()   -  person Justino Rodrigues    schedule 11.10.2014
comment
Ну, я думаю, мой ответ был немного неясным @TerryJanReedy. Я хочу полноэкранные окна Tk() или Toplevel() в Windows SO.   -  person Justino Rodrigues    schedule 13.10.2014
comment
Извините, у меня нет ответа.   -  person Terry Jan Reedy    schedule 15.10.2014


Ответы (4)


Это работает в Windows 7: если ширина и высота второго экрана такие же, как и у первого, вы можете использовать геометрию win1 или win2 следующего кода в зависимости от его относительного положения (слева или справа), чтобы иметь полноэкранный режим на вторичном дисплее:

from Tkinter import *

def create_win():
    def close(): win1.destroy();win2.destroy()
    win1 = Toplevel()
    win1.geometry('%dx%d%+d+%d'%(sw,sh,-sw,0))
    Button(win1,text="Exit1",command=close).pack()
    win2 = Toplevel()
    win2.geometry('%dx%d%+d+%d'%(sw,sh,sw,0))
    Button(win2,text="Exit2",command=close).pack()

root=Tk()
sw,sh = root.winfo_screenwidth(),root.winfo_screenheight()
print "screen1:",sw,sh
w,h = 800,600 
a,b = (sw-w)/2,(sh-h)/2 

Button(root,text="Exit",command=lambda r=root:r.destroy()).pack()
Button(root,text="Create win2",command=create_win).pack()

root.geometry('%sx%s+%s+%s'%(w,h,a,b))
root.mainloop()
person JeanClaudeDaudin    schedule 24.08.2015
comment
У меня есть обходной путь, но вы заслуживаете одобрения и одобрения, так как это может быть полезно для кого-то. Спасибо! - person Justino Rodrigues; 27.03.2017

Пытаться:

from Tkinter import *

rot = Tk()


wth,hgh = rot.winfo_screenwidth(),rot.winfo_screenheight()
#take desktop width and hight (pixel)
_w,_h = 800,600 #root width and hight
a,b = (wth-_w)/2,(hgh-_h)/2 #Put root to center of display(Margin_left,Margin_top)



def spann():
    def _exit():
        da.destroy()

    da = Toplevel()
    da.geometry('%dx%d+%d+%d' % (wth, hgh,0, 0))

    Button(da,text="Exit",command=_exit).pack()
    da.overrideredirect(1)
    da.focus_set()#Restricted access main menu




Button(rot,text="Exit",command=lambda rot=rot : rot.destroy()).pack()


but = Button(rot,text="Show SUB",command=spann)
but.pack()


rot.geometry('%sx%s+%s+%s'%(_w,_h,a,b))
rot.mainloop()
""" Geometry pattern 'WxH+a+b'
        W = Width
        H = Height
        a = Margin_left+Margin_Top"""
person dsgdfg    schedule 22.08.2015

Виндовс, Питон 3.8

В этом решении нажатие F11 сделает окно полноэкранным на текущем экране.

Обратите внимание, что self.root.state("zoomed") зависит от Windows в соответствии с документом.

self.root.overrideredirect(True) странно работает в Windows и может иметь нежелательные побочные эффекты. Например, у меня были проблемы, связанные с изменением конфигурации экрана, когда эта опция активна.

#!/usr/bin/env python3
import tkinter as tk


class Gui:
    fullScreen = False

    def __init__(self):
        self.root = tk.Tk()
        self.root.bind("<F11>", self.toggleFullScreen)
        self.root.bind("<Alt-Return>", self.toggleFullScreen)
        self.root.bind("<Control-w>", self.quit)
        self.root.mainloop()

    def toggleFullScreen(self, event):
        if self.fullScreen:
            self.deactivateFullscreen()
        else:
            self.activateFullscreen()

    def activateFullscreen(self):
        self.fullScreen = True

        # Store geometry for reset
        self.geometry = self.root.geometry()

        # Hides borders and make truly fullscreen
        self.root.overrideredirect(True)

        # Maximize window (Windows only). Optionally set screen geometry if you have it
        self.root.state("zoomed")

    def deactivateFullscreen(self):
        self.fullScreen = False
        self.root.state("normal")
        self.root.geometry(self.geometry)
        self.root.overrideredirect(False)

    def quit(self, event=None):
        print("quiting...", event)
        self.root.quit()


if __name__ == '__main__':
    Gui()
person Love    schedule 26.07.2020

Супер простой метод, работающий в 2021 году

Это работает, даже если оба дисплея имеют разное разрешение. Используйте geometry, чтобы сместить второй дисплей на ширину первого дисплея. Формат строки geometry<width>x<height>+xoffset+yoffset:

root = tkinter.Tk()

# specify resolutions of both windows
w0, h0 = 3840, 2160
w1, h1 = 1920, 1080

# set up a window for first display, if wanted  
win0 = tkinter.Toplevel()
win0.geometry(f"{w0}x{h0}+0+0")

# set up window for second display with fullscreen 
win1 = tkinter.Toplevel()
win1.geometry(f"{w1}x{h1}+{w0}+0") # <- this is the key, offset to the right by w0
win1.attributes("-fullscreen", True)

Пока вы знаете ширину первого дисплея, это будет работать нормально. Система X, на которой работает TK, по умолчанию помещает второй монитор справа от первого.

person Matthew Salvatore Viglione    schedule 08.04.2021