Вам нужно связать d для каждой созданной функции. Один из способов сделать это - передать его как параметр со значением по умолчанию:
lambda d=d: self.root.change_directory(d)
Теперь функция внутри функции использует этот параметр, хотя он имеет то же имя, и значение по умолчанию для который вычисляется при создании функции. Чтобы помочь вам увидеть это:
lambda bound_d=d: self.root.change_directory(bound_d)
Помните, как работают значения по умолчанию, например, для изменяемых объектов, таких как списки и dicts, потому что вы привязываете объект.
Эта идиома параметров с значениями по умолчанию достаточно распространены, но может быть неудачным, если вы исследуете параметры функции и определяете, что делать в зависимости от их присутствия. Вы можете избежать параметра с другим закрытием:
(lambda d=d: lambda: self.root.change_directory(d))()
# or
(lambda d: lambda: self.root.change_directory(d))(d)
. Еще лучше, редизайн того, как вы обрабатываете «команды», поможет здесь и должен помочь в другом месте.
Я решил просто нарисовать родителя под своими дочерними элементами управления вручную. Вот хорошая статья.
Некоторые предложения (извинения за код VB).
Стараются не красить фон:
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = &H14 Then
Return
End If
MyBase.WndProc(m)
End Sub
Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)
Return
End Sub
не называют метод краски основы средств управления:
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
'MyBase.OnPaint(e) - comment out - do not call
End Sub
Прозрачные средства управления в DotNet реализованы при наличии прозрачного управления , контейнер тянет себя в окне прозрачного управления, и затем иметь прозрачный контроль тянут себя. Этот процесс не принимает во внимание возможность наложения средств управления. Таким образом, необходимо будет использовать своего рода обходное решение, чтобы заставить его работать.
В некоторых случаях я имел успех со сложным вложением, но это главным образом только хорошо для быстрого-и-грязного разделения на уровни битовых массивов, и это не решает проблем с неравнодушным наложением средств управления.