tkinter winfo_screenwidth() when used with dual monitors
Asked Answered
P

2

10

With tkinter canvas, to calculate the size of the graphics I display, I normally use the function winfo_screenwidth(), and size my objects accordingly. But when used on a system with two monitors, winfo_screenwidth() returns the combined width of both monitors -- which messes up my graphics. How can I find out the screen width in pixels of each monitor, separately?

I have had this problem with several versions of Python 3.x and several versions of tkinter (all 8.5 or above) on a variety of Linux machines (Ubuntu and Mint).

For example, the first monitor is 1440 pixels wide. The second is 1980 pixels wide. winfo_screenwidth() returns 3360.

I need to find a way to determine the screenwidth for each monitor independently.

Thanks!

Phyletic answered 18/5, 2015 at 21:10 Comment(3)
Duplicate of this I think.Propagandist
@Propagandist it isn't. They are two related, but different issues.Biblio
Ran into this exact problem see: <#24378488>Periclean
D
8

It is an old question, but still: for a cross-platform solution, you could try the screeninfo module, and get information about every monitor with:

import screeninfo
screeninfo.get_monitors()

If you need to know on which monitor one of your windows is located, you could use:

def get_monitor_from_coord(x, y):
    monitors = screeninfo.get_monitors()

    for m in reversed(monitors):
        if m.x <= x <= m.width + m.x and m.y <= y <= m.height + m.y:
            return m
    return monitors[0]

# Get the screen which contains top
current_screen = get_monitor_from_coord(top.winfo_x(), top.winfo_y())

# Get the monitor's size
print current_screen.width, current_screen.height

(where top is your Tk root)

Dedans answered 10/9, 2019 at 7:33 Comment(0)
P
2

Based on this slightly different question, I would suggest the following:

 t.state('zoomed')
 m_1_height= t.winfo_height()
 m_1_width= t.winfo_width() #this is the width you need for monitor 1 

That way the window will zoom to fill one screen. The other monitor's width is just wininfo_screenwidth()-m_1_width

I also would point you to the excellent ctypes method of finding monitor sizes for windows found here. NOTE: unlike the post says, ctypes is in stdlib! No need to install anything.

Propagandist answered 18/5, 2015 at 21:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.