Widgets werden nicht angezeigt

Fragen zu Tkinter.
BlackJack

Beitragvon BlackJack » Donnerstag 31. Januar 2008, 14:46

Tk hat keine Methoden um die Bildschirmauflösung fest zu stellen und das Fenster auf eine gegebene Position zu verschieben, sondern nur welche, die den WM danach fragen bzw. darum bitten.

Ein rationaler Grund für einen WM diese Bitte zu ignorieren, ist zum Beispiel, wenn er weiss, dass sich der Screen über zwei nebeneinander angeordnete Bildschirme erstreckt. Dort Fenster mittig zu platzieren ist nämlich äusserst ungünstig für den Benutzer, weil er dann je ein halbes Fenster auf jedem Monitor hat.
lunar

Beitragvon lunar » Donnerstag 31. Januar 2008, 17:02

pütone hat geschrieben:
Will das dein User auch?

Ja, der User will das. Ich bin der User, und ich will die zentrierte Darstellung.

Ich wusste ja nicht, dass das eine works-for-me-only-Lösung sein sollte... ich ging von der Annahme aus, dass dein Programm veröffentlicht werden sollte. In diesem Fall sollte man sich GUI-Styleguides halten, und diese empfehlen eigentlich immer, auf feste Positionsvorgaben zu verzichten, um den User die Organisation seines Desktops nicht aufzuzwingen.

Aber diese Sache funktioniert sowieso nicht wirklich.


Natürlich funktioniert die Sache! Der Tipp von BlackJack ist da eindeutig. Probier das Programm doch aus. Wieso stellst du Behauptungen auf, die schlicht nicht stimmen?

Er funktioniert unter KWin. Ein einziger Window-Manager ist unter Linux kaum "eindeutig", immerhin gibt es deren dutzende. larswm z.B. verfolgt ein ganz anderes Konzept des Fenstermanagement. Dort gibt es überhaupt gar keine zentrierten Fenster. Und auch KWin kann ich ohne weiteres dazu bringen, deine vorgegebene Position zu ignorieren.

Du scheinst von Tk wirklich nicht viel zu verstehen.

Ich verstehe tatsächlich wenig von Tk. Nur ist Tk selbst in dieser Sache irrelevant. Die endgültige Positionierung wird unter X11 nämlich durch den Window-Manager festgelegt.

Tk liefert Methoden zur Ermittlung der Bildschirmauflösung und der Fensterabmessungen - daraus eine zentrierte Positionierung zu ermitteln ist doch ein Leichtes, sofern die gelieferten Daten über die Fensterabmessungen korrekt geliefert werden.

Weder sind diese Daten immer korrekt, noch ist die berechnete Position des Fensters unter X11 endgültig. An die Abmessungen von Titelleiste und Fensterrahmen kommt die Anwendung unter X11 nämlich gar nicht heran. Folglich ist die berechnete Position höchstwahrscheinlich falsch. Das ist aber letztendlich auch egal, denn sie ist sowieso nur eine Empfehlung an den Fenstermanager. Zwar folgen die meisten Fenstermanager dieser Empfehlung, nur sind sie eben nicht dazu gezwungen. Dazu aus der Dokumentation von Qt4:

On X11, a window does not have a frame until the window manager decorates it. This happens asynchronously at some point in time after calling QWidget::show() and the first paint event the window receives, or it does not happen at all. Bear in mind that X11 is policy-free (others call it flexible). Thus you cannot make any safe assumption about the decoration frame your window will get. Basic rule: There's always one user who uses a window manager that breaks your assumption, and who will complain to you.

Furthermore, a toolkit cannot simply place windows on the screen. All Qt can do is to send certain hints to the window manager. The window manager, a separate process, may either obey, ignore or misunderstand them. Due to the partially unclear Inter-Client Communication Conventions Manual (ICCCM), window placement is handled quite differently in existing window managers.

X11 provides no standard or easy way to get the frame geometry once the window is decorated. Qt solves this problem with nifty heuristics and clever code that works on a wide range of window managers that exist today. Don't be surprised if you find one where QWidget::frameGeometry() returns wrong results though.

Nor does X11 provide a way to maximize a window. QWidget::showMaximized() has to emulate the feature. Its result depends on the result of QWidget::frameGeometry() and the capability of the window manager to do proper window placement, neither of which can be guaranteed.


Was hat das mit dem Window Manager zu tun? Tk hat Methoden zur absoluten Bildschirmpositionierung - der Window Manager hat da nix zu melden.

Der Window Manager ist immer für die Positionierung zuständig! Er kann Fenster letztendlich positionieren, wie er möchte! Unter Windows folgt der WM dem Fenster, unter Linux ist er aber keineswegs dazu gezwungen. Die "absolute Bildschirmplatzierung" in Tk ist mehr oder weniger eine Illusion. Absolute Bildschirmplatzierung gibt es unter X11 nicht, zumindest nicht auf Applikationsebene.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Donnerstag 31. Januar 2008, 20:34

@BlackJack & lunar:

Danke für die Nachilfe zum Thema "Window Manager". Wieder was dazu gelernt.

Da habe ich sozusagen Glück oder zufällig den richtigen Window Manager, der die zentrierte Ausgabe meiner kleinen Anwendung möglich macht.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Donnerstag 31. Januar 2008, 20:49

Nachtrag @lunar:

Und auch KWin kann ich ohne weiteres dazu bringen, deine vorgegebene Position zu ignorieren.


Das hat mich neugierig gemacht. Zumindest mit den Einstellungen, die über das Kontrollzentrum hinsichtlich der Platzierung von Fenstern möglich sind, ist es mir nicht gelungen dafür zu sorgen, dass meine zentrierte Anwendung woanders als in der Bildschirmmitte angezeigt wird.

Auch wenn es nichts mit Python zu tun hat: WIE würdest du denn KWin dazu bringen, dass meine Anwendung nicht mehr zentriert ausgegeben wird?

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder