Даже после изменения имени файла, если вы запускаете питон из терминала.
(вы можете получить ту же ошибку)
Kindly
rm -rf socket.pyc
(ранее скомпилированный байт-код)
Вам нужно перерисовать графику (или хотя бы ее часть под прямоугольником). Если это графический блок или что-то подобное, используйте Invaldiate () , чтобы принудительно перерисовать.
Если прямоугольник полностью перекрывает графику, у вас должна быть возможность просто перерисовать или обновить нижележащую графику. Если это не так, вам нужно будет перерисовать прямоугольник, используя цвет фона, а затем обновить базовое изображение.
Я полагаю, это должно работать, чтобы скопировать исходные данные с поверхности во временное растровое изображение перед рисованием прямоугольника, а затем отрисовать растровое изображение обратно на место.
Обновление
Есть уже принятый ответ, но я подумал, что все равно могу поделиться образцом кода. Он рисует данный прямоугольник красным цветом на данном элементе управления и восстанавливает область через 500 мс.
public void ShowRectangleBriefly(Control ctl, Rectangle rect)
{
Image toRestore = DrawRectangle(ctl, rect);
ThreadPool.QueueUserWorkItem((WaitCallback)delegate
{
Thread.Sleep(500);
this.Invoke(new Action<Control, Rectangle, Image>(RestoreBackground), ctl, rect, toRestore);
});
}
private void RestoreBackground(Control ctl, Rectangle rect, Image image)
{
using (Graphics g = ctl.CreateGraphics())
{
g.DrawImage(image, rect.Top, rect.Left, image.Width, image.Height);
}
image.Dispose();
}
private Image DrawRectangle(Control ctl, Rectangle rect)
{
Bitmap tempBmp = new Bitmap(rect.Width + 1, rect.Height + 1);
using (Graphics g = Graphics.FromImage(tempBmp))
{
g.CopyFromScreen(ctl.PointToScreen(new Point(rect.Top, rect.Left)), new Point(0, 0), tempBmp.Size);
}
using (Graphics g = this.CreateGraphics())
{
g.DrawRectangle(Pens.Red, rect);
}
return tempBmp;
}