有没有办法更改小部件(在这种情况下为ttk.frame)父级?我在窗口小部件 .config 中找不到任何关键字。这在python tkinter中是不可能的?我在功能上想要的是将我当前的帧放在我的tkk.notebook小部件中,当我双击选项卡时,将所有内容放在选项卡的框架中,移动到它自己独立的TopLevel窗口。这样,在另一个选项卡上工作时,用户可以对该选项卡进行可视化引用。如果没有我正在询问的框架功能,我想不出有任何其他方法可以实现这一点。也许任何人都可以绕过这个问题,我不需要担心父窗口小部件功能。
干杯, 克里斯
答案 0 :(得分:9)
Fredrik Lundh(Tkinter作者)的old post表示无法更改小部件的父级。
答案 1 :(得分:0)
您不能将一个小部件或小部件组移动到新的父级,但是可以使用一些简单的例程来模拟它。我不在python中工作,但是您应该能够将以下代码从tcl转换为tkinter。通过模拟,我的意思是您将小部件和所有儿童递归地复制到新的父级。 Tk提供了自检,以精确复制要移动/复制的小部件(包括所有子小部件)的布局,绑定和外观。遵循以下例程,您可以将单个或复杂的小部件移动或复制到新的父级。
proc getWidgetType { w } {
set class [winfo class $w ]
if { [ string index $class 0 ] eq "T" &&
[ string match "\[A-Z\]" [string index $class 1 ] ] } {
set class [string range [string tolower $class ] 1 end ]
set class "ttk::$class"
} else {
set class [string tolower $class ]
}
return $class
}
proc getConfigOptions { w } {
set configure [ $w configure ]
set options {}
foreach f $configure {
if { [llength $f ] < 3 } { continue; }
set name [ lindex $f 0 ]
set default [ lindex $f end-1 ]
set value [ lindex $f end ]
if { $default ne $value } {
lappend options $name $value
}
}
return $options
}
proc copyWidget { w newparent { level 0 } } {
set type [ getWidgetType $w ]
set name [ string trimright $newparent.[lindex [split $w "." ] end ] "." ]
set retval [ $type $name {*}[ getConfigOptions $w ] ]
foreach b [ bind $w ] {
puts "bind $retval $b [subst { [bind $w $b ] } ] "
catch { bind $retval $b [subst { [bind $w $b ] } ] }
}
if { $level > 0 } {
if { [ catch { pack info $w } err ] == 0 } {
array set temp [ pack info $w ]
array unset temp -in
catch { pack $name {*}[array get temp ] }
} elseif { [ catch { grid info $w } err ] == 0 } {
array set temp [ grid info $w ]
array unset temp -in
catch { grid $name {*}[array get temp ] }
}
}
incr level
if { [ pack slaves $w ] ne "" } {
foreach f [ pack slaves $w ] {
copyWidget $f $name $level
}
} else {
foreach f [winfo children $w ] {
copyWidget $f $name $level
}
}
return $retval
}
proc moveWidget { w newparent } {
set retval [ copyWidget $w $newparent ]
destroy $w
return $retval
}
# assume we have already created a toplevel with complex layout named
# .input with subframe .input.frame.tframe that we want to transfer to
# a new toplevel .x . There is a cancel button we want to transfer
# also at .input.frame.bframe.icancel and we will grid it into
# .x.tframe .
toplevel .x
set form [ moveWidget .input.frame.tframe .x ]
set cancel [ moveWidget .input.frame.bframe.icancel .x.tframe ]
grid $cancel -row 2 -column 2 -sticky new
pack $form -anchor center -expand 1 -fill both -side top