Schrift
[thread]5279[/thread]

Größe eines Frames/Canvas ermitteln



<< >> 8 Einträge, 1 Seite
seb
 2007-01-10 19:54
#46110 #46110
User since
2007-01-10
5 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habemit der grid-Methode ein Canvas gepackt, welches mit columnspan auch über mehrere Reihen geht.
Gibt es eine Möglichkeit die aktuelle Größe des Canvas rauszubekommen. Ich will dann verschiedene Objekte in der Mitte oder bei 1/3 (etc.) in diesem Canvas platzieren.

Danke!
PerlProfi
 2007-01-10 20:38
#46111 #46111
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Die Breite bekommst du mittels $canvas->width() und die Höhe mittels $canvas->height().

MfG PerlProfi
seb
 2007-01-11 00:38
#46112 #46112
User since
2007-01-10
5 Artikel
BenutzerIn
[default_avatar]
hab ich schon probiert... Da kommt als Wert aber immer nur "1" raus, obwohl die einzelnen Elemente unterschiedlich breit sind.\n\n

<!--EDIT|seb|1168468896-->
ptk
 2007-01-11 01:02
#46113 #46113
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
width/height wird erst gesetzt, wenn die Fenster sichtbar werden. Das kann man mit einem $mw->update erzwingen. Vorher könnte man reqwidth/reqheight verwenden (requested width/height).
seb
 2007-01-11 18:09
#46114 #46114
User since
2007-01-10
5 Artikel
BenutzerIn
[default_avatar]
Das führt leider alles noch nicht zu meinem gewünschten Ergebnis...

Ich hab noch vergessen zu erwähnen, das das Canvas-Element nicht nur über mehrer Spalten (columnspan) geht, sondern mit -sticky->we auch noch über die gesammte Länge der entsprechenden Spalten geht. Diese "gedehnte" Länge interessiert mich.

Das mit dem $mw->update funktioniert leider auch nicht.
Fehlermeldung: Can't call method "update" on an undefined value.

Ich rufe den Befehl aus einer sub auf, und mein MainWindow heißt auch $mw.
PerlProfi
 2007-01-11 19:03
#46115 #46115
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
width() und height() sind aber die Methoden die du suchst.

Das folgende Programm demonstriert es dir mal:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/perl
use strict;
use warnings 'all';
use Tk;

# MainWindow erzeugen
my $mw = tkinit();

# Canvas erstellen und platzieren
my $c = $mw->Canvas(-background => "white")->grid(-row => 0, -column => 0, -columnspan => 2, -sticky => "ew");

# Canvas strecken(wie -expand bei pack())
$mw->gridColumnconfigure(0, -weight => 1);
$mw->gridColumnconfigure(1, -weight => 1);
$mw->gridRowconfigure(0, -weight => 1);

# Fenster mappen(es wird gezeichnet)
$mw->update();

# Breite und Höhe vom Canvas ausgeben
print "Breite: ", $c->width(), "\nHoehe: ", $c->height(), "\n";

# Button erstellen, mit dem man immer die aktuelle Größe des Canvas ausgeben kann
$mw->Button(-text => "Canvas Größe ausgeben", -command => sub { print "Breite: ", $c->width(), "\nHoehe: ", $c->height(), "\n"})->grid;

# MainLoop starten
MainLoop;

In dem Beispiel wird das Canvas natürlich nur horizontal gestreckt. Dabei verändert sich nunmal die Höhe nicht.
Aber an der Breite kannst du es schön sehen. Und am Anfang steht da auch nicht 1.

Die Fehlermeldung, die du bekommen hast, hat wohl damit zutun, dass es $mw in dem scope wo du update() aufgerufen hast nicht gibt.

MfG PerlProfi
seb
 2007-01-11 22:16
#46116 #46116
User since
2007-01-10
5 Artikel
BenutzerIn
[default_avatar]
Ich habs inzwischen hinbekommen. Trotzdem Danke!

Ich musste lediglich die Variable $mw explizit vom Hauptprogramm in die Subroutine übergeben.

Ich muss aber leider weiter nerven :D

Da ich das $mw->update mit in einer Schleife ausführen muss (weil es wohl direkt vor $canvas->width stehen muss, um eine Wirkung zu haben (also keine Widgets zwischendrinn erzeugt werden dürfen)), kann man dem Bild beim Aufbau fast zusehen (recht langsam).
Gibt es eine Methode das updaten zu beschleunigen?

Danke nochmal!
PerlEinsteiger
ptk
 2007-01-11 23:37
#46117 #46117
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich kann mir nicht so richtig vorstellen, warum du immer update() in einer Schleife aufrufen möchtest. Und nein, man muss auf update() verzichten, wenn man es schnell haben möchte. In einer Applikation von mir, bei der ein Canvas gefüllt wird und gleichzeitig ein Progressbar angezeigt wird (viele Update-Aufrufe notwendig!), mache ich während des Füllens das Canvas unsichtbar (mittels packForget o.ä.) und erhalte damit ein viel schnelleres Ergebnis.
<< >> 8 Einträge, 1 Seite



View all threads created 2007-01-10 19:54.