如何在Python Tkinter程序中处理窗口关闭事件(用户单击"X"按钮)?
我知道使用fire-and-forget async void方法来启动任务通常被认为是一个坏主意,因为没有跟踪任务的跟踪,处理可能在这种方法中抛出的异常是很棘手的.
我一般应该避免使用async void事件处理程序吗?例如,
private async void Form_Load(object sender, System.EventArgs e)
{
await Task.Delay(2000); // do async work
// ...
}
Run Code Online (Sandbox Code Playgroud)
我可以像这样重写它:
Task onFormLoadTask = null; // track the task, can implement cancellation
private void Form_Load(object sender, System.EventArgs e)
{
this.onFormLoadTask = OnFormLoadTaskAsync(sender, e);
}
private async Task OnFormLoadTaskAsync(object sender, System.EventArgs e)
{
await Task.Delay(2000); // do async work
// ...
}
Run Code Online (Sandbox Code Playgroud)
除了可能的重入之外,异步事件处理程序的水下岩石是什么?
有没有办法查看哪些函数/代码附加到DOM元素的任何事件?使用Firebug或任何其他工具.
除了语法糖之外,我没有看到使用事件而不是代理的优点.也许我是误会,但似乎事件只是代表的占位符.
你能告诉我差异以及何时使用哪个?有哪些优点和缺点?我们的代码严重依赖于事件,我想深入了解它.
你何时会在事件中使用代表,反之亦然?请在生产代码中说明您对这两者的真实体验.
我完全意识到我提出的建议并不遵循.NET准则,因此,仅凭这个原因可能是一个糟糕的想法.但是,我想从两个可能的角度考虑这个问题:
(1)我是否应考虑将此用于我自己的开发工作,100%用于内部目的.
(2)这是框架设计者可以考虑改变或更新的概念吗?
我正在考虑使用一个使用强类型"发送者"的事件签名,而不是将其键入"对象",这是当前的.NET设计模式.也就是说,而不是使用如下所示的标准事件签名:
class Publisher
{
public event EventHandler<PublisherEventArgs> SomeEvent;
}
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用一个使用强类型'sender'参数的事件签名,如下所示:
首先,定义一个"StrongTypedEventHandler":
[SerializableAttribute]
public delegate void StrongTypedEventHandler<TSender, TEventArgs>(
TSender sender,
TEventArgs e
)
where TEventArgs : EventArgs;
Run Code Online (Sandbox Code Playgroud)
这与Action <TSender,TEventArgs>并没有什么不同,但通过使用StrongTypedEventHandler,我们强制执行TEventArgs派生System.EventArgs.
接下来,作为示例,我们可以在发布类中使用StrongTypedEventHandler,如下所示:
class Publisher
{
public event StrongTypedEventHandler<Publisher, PublisherEventArgs> SomeEvent;
protected void OnSomeEvent()
{
if (SomeEvent != null)
{
SomeEvent(this, new PublisherEventArgs(...));
}
}
}
Run Code Online (Sandbox Code Playgroud)
上述安排将使订阅者能够使用不需要强制转换的强类型事件处理程序:
class Subscriber
{
void SomeEventHandler(Publisher sender, PublisherEventArgs e)
{
if (sender.Name == "John Smith")
{
// ...
}
}
} …Run Code Online (Sandbox Code Playgroud) 我想在用户选择文件时触发事件..change如果用户每次都更改文件,则对事件执行此操作.
但是如果用户再次选择相同的文件,我想激活该事件.
A.jpg(事件触发)B.jpg(事件触发)B.jpg(事件不会触发,我希望它触发)我该怎么做?
让我详细描述一下这个问题:
我想在悬停在元素上时显示绝对定位的div.使用jQuery非常简单,工作得很好.但是当鼠标移过其中一个子元素时,它会触发包含div的mouseout事件.在悬停子元素时,如何防止javascript触发包含元素的mouseout事件.
使用jQuery做到这一点的最佳和最短的方法是什么?
这是一个简化的例子来说明我的意思:
HTML:
<a>Hover Me</a>
<div>
<input>Test</input>
<select>
<option>Option 1</option>
<option>Option 2</option>
</select>
</div>
Run Code Online (Sandbox Code Playgroud)
使用Javascript/jQuery的:
$('a').hover( function() { $(this).next().show() }
function() { $(this).next().hide() } );
Run Code Online (Sandbox Code Playgroud) 我想用jQuery捕获一个click事件,并能够判断是否同时按下了一个键,这样我就可以根据keypress事件在回调函数中进行分支.
例如:
$("button").click(function() {
if([KEYPRESSED WHILE CLICKED]) {
// Do something...
} else {
// Do something different...
}
});
Run Code Online (Sandbox Code Playgroud)
这有可能吗?如果可能的话怎么办呢?
我试图用一个touchstart事件的jQuery获得X位置,与live函数一起使用?
即
$('#box').live('touchstart', function(e) { var xPos = e.PageX; } );
Run Code Online (Sandbox Code Playgroud)
现在,这可以使用'click'作为事件.如何(不使用alpha jQuery Mobile)我是否通过触摸事件获得它?
有任何想法吗?
谢谢你的帮助.
我目前有一个声明如下的页面:
public partial class MyPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//snip
MyButton.Click += (o, i) =>
{
//snip
}
}
}
Run Code Online (Sandbox Code Playgroud)
我最近才从1.1迁移到.NET 3.5,所以我习惯在Page_Load之外编写事件处理程序.我的问题是; 在使用lambda方法时,我应该注意哪些性能缺陷或缺陷?我更喜欢它,因为它当然更简洁,但我不想牺牲性能来使用它.谢谢.
events ×10
c# ×4
jquery ×4
javascript ×3
.net ×2
click ×2
async-await ×1
asynchronous ×1
delegates ×1
html ×1
keyboard ×1
lambda ×1
performance ×1
python ×1
tkinter ×1
touch ×1
vb.net ×1
window ×1