две вещи: во-первых, чтобы проверить тип чего-то более питонского для использования
isinstance(t, int)
, но во-вторых, когда ваш код не работает.
Если вы оцениваете литерал, вы, скорее всего, получите ошибку имени, поскольку переменная нигде не определена. Однако, если вы введете «с», например, вы получите что-то странное полностью. Поскольку переменная c определена, вы не получите ошибку имени, но она все равно потерпит неудачу при приведении литерала 'c' к int.
Вы можете использовать регулярное выражение, чтобы проверить, является ли ввод числом или нет
, например, так.
if re.match('(\d+(\.\d+)?)', a):
try:
t = eval(a)
print(type(t))
except (NameError, ValueError):
pass
elif a == 'q' or a == 'Q':
break
else:
continue
if isinstance(t, int):
sum_i = sum_i + int(a)
c = c + 1
elif isinstance(t, float):
sum_f = sum_f + float(a)
c = c + 1
else:
print("Invalid data entered. Please enter a number to add or q/Q to quit. ")
Это ужасно походит на эту проблему.
При изменении размеров окон в Windows Вы обычно получаете цепочку, где каждое окно получает a WM_SIZE
обменивайтесь сообщениями и затем звоните MoveWindow()
(или подобный) на его детях, которые в свою очередь получают a WM_SIZE
и так далее. Я уверен, что.NET делает то же самое под покрытиями.
На x64 Windows ограничивает глубину этого вложения, и после определенного момента (12-15 вложенных окон), это просто не отправит WM_SIZE
сообщения больше. Это ограничение, кажется, не существует на x86. Это ограничение влияет и на x86 и на код x64, работающий x64 версии Windows.
Это одурачило нас целую вечность, когда у различных установок x64 появятся различные симптомы. Сообщение в блоге MSDN выше имеет некоторые возможные обходные решения - мы закончили тем, что использовали вторичный поток, чтобы сделать размеры окна асинхронно, это решило проблему справедливо аккуратно.
При использовании Windows Forms они могли бы относиться к вложенным проблемам ограничения о 64-разрядном Windows.
Детали здесь: http://www.feedghost.com/Blogs/BlogEntry.aspx?EntryId=17829
Таким образом...
Из источника MS, в Управлении. SetBoundsCore:
SafeNativeMethods.SetWindowPos(new HandleRef(window, Handle), NativeMethods.NullHandleRef, x, y, width, height, flags);
// NOTE: SetWindowPos causes a WM_WINDOWPOSCHANGED which is processed
// synchonously so we effectively end up in UpdateBounds immediately following
// SetWindowPos.
//
//UpdateBounds(x, y, width, height);
И из MSDN:
"Немного расследования показало, что Windows прекращает отправлять WM_SIZE, когда это достигает некоторого определенного уровня вложенности. Другими словами, это не отправит WM_SIZE в Ваши дочерние окна, при попытке изменить размер их при обработке WM_SIZE в родительских. В зависимости от ПОЛЬЗОВАТЕЛЯ stuff/updates/serivice упаковывает максимальный уровень вложенности, на котором он прекращает распространять WM_SIZE, может варьироваться от 15 до 31 и еще намного выше (эффективно недостижимый) под последним XP 32bit/sp2.
Но это все еще слишком мало под XP x64 и все еще некоторыми подобными ужасными вещами происходит с другими сообщениями под некоторыми сборками Vista.
Таким образом, это - конечно, ошибка Windows."
У Вас есть два варианта: любой уменьшает глубину Вашей иерархии управления (более идеальное решение) или иначе получает "зафиксированные" средства управления из каждого из системных, которые Вы используете, следующим образом:
public class FixedPanel : Panel
{
protected override void SetBoundsCore( int x, int y, int width, int height, BoundsSpecified specified )
{
base.SetBoundsCore( x, y, width, height, specified );
if( specified != BoundsSpecified.None )
{
if( ( specified & BoundsSpecified.X ) == BoundsSpecified.None )
{
x = Left;
}
if( ( specified & BoundsSpecified.Y ) == BoundsSpecified.None )
{
y = Top;
}
if( ( specified & BoundsSpecified.Width ) == BoundsSpecified.None )
{
width = Width;
}
if( ( specified & BoundsSpecified.Height ) == BoundsSpecified.None )
{
height = Height;
}
}
if( x != Left || y != Top || width != Width || height != Height )
{
UpdateBounds( x, y, width, height );
}
}
}
Я думаю, что наиболее вероятной причиной этой проблемы является проблема перерисовки в Вашем приложении. Возможно, что существует тонкое сообщение окон, заказывая различие на 64 битах, которое выставляет эту проблему в Вашем коде.
Можно экспериментировать с этим путем выполнения следующего.
Я устанавливал бы таймер на что-то долго как 5 секунд. Затем запустите приложение на Win64 и посмотрите, устраняет ли это проблему. Раз так затем наиболее вероятной причиной являются одни из Ваших средств управления, правильно не сигнализирует, что это делалось недействительным.
Я запустил бы с любых пользовательских элементов управления в приложении. Систематически добавляйте, что Обновление звонит в каждый переопределенный метод и обработчик событий в коде. В конечном счете Вы найдете тот, который устраняет проблему, и затем Вы будете знать, где ошибка на самом деле.
Я согласился бы с Gordon. Я видел проблемы, где совершенно новые 64-разрядные машины имели проблемы дисплея с программами, которые выглядели хорошо под 32-разрядным, но покажут нечетные проблемы о 64-разрядных машинах. Обновление к последним/рекомендованным драйверам почти всегда устраняло проблему.
Походит на проблему драйвера дисплея мне...
Попытайтесь обновить к последним драйверам и посмотрите, решает ли это проблему? Различием на 64/32 бита является, вероятно, отвлекающий маневр...
То, что можно запустить программу на виртуальной ОС без проблем, предполагает, что это - проблема драйвера, потому что (по крайней мере, в VirtualPC) видеокарта эмулирована. Это означает, что некоторые вещи, которые обычно обрабатывала бы видеокарта, теперь сделаны ЦП, и таким образом не взаимодействующий с графическим драйвером. Обратите внимание то, что я не эксперт по виртуализации, и я предполагаю, что слой виртуализации мог влиять на проблему другими способами.
Я полагаю, что это связано с вложенным HWND's числа в дереве. Я не знаю определенные детали, но были некоторые ограничения, установленные для вложенного HWNDs с 64 битами. Времена я видел, что он происходит, я работаю вокруг этого путем ронения из полной Vista Basic (или аэро) темы классику окон. В этой точке уходят проблемы.
Попытайтесь переключиться на классика, и если это разрешает его, посмотрите, можно ли сократить количество вложенного HWNDs.
Если вы используете решение BeginInvoke () описано в блоге MSDN , не забудьте отключить закрепление дочерних элементов элемента управления, который переопределяет OnSizeChanged (). У меня был Dock = DockStyle.Fill, и мне пришлось изменить его на DockStyle.None, чтобы исправление сработало.