Я бы предложил использовать random.shuffle
, затем list.pop
, чтобы избежать дублирования ключей и значений, чтобы всегда иметь три элемента в dict (пропущенный пользовательский ввод, уже показано в других ответах):
import random
colors=['black','blue','green','red','yellow']
nums=[1,2,3,4,5]
res = {}
for _ in range(3):
random.shuffle(colors)
random.shuffle(nums)
num, color = nums.pop(), colors.pop()
res[num] = color
print(res)
#=> {4: 'green', 3: 'yellow', 1: 'black'}
print(res[1])
#=> black
print(colors, nums) # not used
#=> ['blue', 'red'] [2, 5]
Я нашел разумное обходное решение, я установил внимание на главное меню вручную:
Править: Как предложено @TcKs, я изменил событие от ItemClicked до MenuActivate. Большое спасибо за справку!
private void menuStrip1_MenuActivate( object sender, EventArgs e )
{
menuStrip1.Focus();
}
Необходимо использовать события "Validating" и "Validated" для проверки входа пользователя. Затем, если пользователь перейдет к другому управлению "A", и управлению "A" установили свойство "CausesValidating" на "истинный" (его значение по умолчанию), то событие "Validating" и "Validated" будет запущено.
Меню имеет свойство "CuasesValidating" также.
Править: Извините, я забыл, что "CuasesValidating" в полосе меню является нашей функциональностью и не встроенный. Но проверка на проверку довольно проста:
private void menuStrip1_MenuActivate( object sender, EventArgs e ) {
bool ret = this.Validate( false );
if ( false == ret ) {
// user's input is wrong
}
}
Пользователь любой ContainerControl вместо "этого", если Вы хотите, проверяет проверку в другое управление, чем "эта" форма. Например, в Дочернем окне MDI.
Существуют некоторые случаи, когда Lostfocus не запущен, например, нажав кнопки на панели инструментов и пункты меню. Я использую, чтобы работать вокруг этого с локальной переменной "LastControl" и обработать ее сам, когда меню получило фокус.
Существуют причины, что щелчок меню не делает теряет фокус текстового поля. Если Вы хотите иметь, например, меню "Edit" со "Вставкой" в, "Вставка" должна действовать против управления, которое фокусируется, и из-за этого это не должно красть фокус ни из каких средств управления на форме.
Таким образом, меню может рассматриваться как контекстное меню, которые не крадут фокус из управления.
при проигрывании с меню необходимо моделировать, так или иначе, lostfocus и возможно помнящий, где это было в случае, если Вы закрываете меню, ничего не делая так, что фокус возвратился бы в текстовое поле
Вам нужна маркировка 1 пиксель на 1 пиксель
Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave
MsgBox("yes")
End Sub
Private Sub MenuStrip1_MenuActivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuActivate
CType(sender, MenuStrip).Tag = ActiveControl
Label1.Focus()
End Sub
Private Sub MenuStrip1_MenuDeactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuDeactivate
If CType(sender, MenuStrip).Tag Is Control AndAlso CType(CType(sender, MenuStrip).Tag, Control).CanFocus Then
CType(CType(sender, MenuStrip).Tag, Control).Focus()
End If
CType(sender, MenuStrip).Tag = Nothing
End Sub