Discussion:
event generate send arg
Add Reply
Shaun Kulesa
2025-01-01 23:59:41 UTC
Reply
Permalink
I'm trying to block any user interaction that is not done via `event generate`.
To do this I want to break the bindings when $user is not 1.
I want to pass the $user arg to the procedure `block` but I do not know how to.
I thought this is done by -data but I get an error saying I can not use that with the event <ButtonPress>.

```
package require Tk

button .b -text "Hello, World!"
pack .b -padx 20 -pady 20

proc block {{user 0}} {
if {$user ne 1} {
return -code break
}
return
}

bind .b <ButtonPress> {block}
bind .b <ButtonRelease> {block}

after 1000 [list event generate .b <ButtonPress> -data 1]
```
Rich
2025-01-02 04:13:10 UTC
Reply
Permalink
Post by Shaun Kulesa
I'm trying to block any user interaction that is not done via `event generate`.
First question is: why? What are you really trying to accomplish?

Next suggestion, have you looked into using 'tk busy' (man n busy). It
might work better than having to remap every single default event
binding within Tk.
Post by Shaun Kulesa
To do this I want to break the bindings when $user is not 1.
I want to pass the $user arg to the procedure `block` but I do not know how to.
Note the documentation for -data in the event manpage:

-data string
String may be any value; it specifies the user_data field for
the event. Only valid for virtual events. Corresponds to the
%d substitution for virtual events in binding scripts.

It tells you how to retreive the '-data' field value, you use the %d
substitution.

But -data is also "only valid for virtual events" which is why you
can't use it with <ButtonPress> (because <ButtonPress> is not a virtual
event).
Post by Shaun Kulesa
I thought this is done by -data but I get an error saying I can not
use that with the event <ButtonPress>.
```
package require Tk
button .b -text "Hello, World!"
pack .b -padx 20 -pady 20
proc block {{user 0}} {
if {$user ne 1} {
return -code break
}
return
}
bind .b <ButtonPress> {block}
bind .b <ButtonRelease> {block}
after 1000 [list event generate .b <ButtonPress> -data 1]
```
Shaun Kulesa
2025-01-02 10:25:18 UTC
Reply
Permalink
Post by Rich
First question is: why? What are you really trying to accomplish?
I am running live clones of a Tk GUI over a server.

These clones are just a clone of the host GUI which I do by collecting all the widget data from the host and then rebuild in the clients.

I use a library that tells me all events that have happened, it tells me if it was done by manual interaction or by `event generate`.

I want the clients manual interactions to be sent to the server to dispute whether they are up to date with the other clients.

Therefore I want the client to be able to gather their input but not act on it unless the server agrees.
Shaun Kulesa
2025-01-02 12:57:38 UTC
Reply
Permalink
I just realised since the package I'm using already decides what is synthetic and what is real I can just copy it.

According the co-pilot it checks the time %t and if it is equal to 0 then it is a synthetic `event generate`.
Loading...