我试图获得一个按钮来使用Python(使用Tkinter)做一些事情。我希望该按钮获得组合框的当前选择并在屏幕上打印。
图形布局是3个单独的框架,但是按钮和组合框都位于同一框架(框架#2)中。
问题是我无法引用组合框。我正在阅读的错误:
import UIKit
class ViewController: UIViewController, UIScrollViewDelegate {
// MARK: - Properties
var scrollView: UIScrollView!
let numPages = 6
var pages = [UIView?]()
var imageViews:[UIImageView] = [UIImageView](){
didSet{
print("imageViews.count: \(imageViews.count)")
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
_ = setupInitialPages
}
override func viewDidLoad() {
super.viewDidLoad()
scrollView = UIScrollView(frame: view.bounds)
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.isPagingEnabled = true
view.addSubview(self.scrollView)
scrollView.backgroundColor = UIColor.blue
scrollView.delegate = self
scrollView.indicatorStyle = .white
NSLayoutConstraint.activate([
scrollView.topAnchor.constraint(equalTo: self.view.topAnchor),
scrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
scrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
scrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor)
])
pages = [UIView?](repeating: nil, count: numPages)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// MARK: - Initial Setup
lazy var setupInitialPages: Void = {
adjustScrollView()
loadPage(0)
loadPage(1)
}()
// MARK: - Utilities
fileprivate func removeAnyImages() {
for page in pages where page != nil {
page?.removeFromSuperview()
}
}
fileprivate func adjustScrollView() {
scrollView.contentSize =
CGSize(width: scrollView.frame.width * CGFloat(numPages),
height: scrollView.frame.height - topLayoutGuide.length)
}
func getImage(page:Int)->UIImage{
let resourceName = String(page + 1)
return #imageLiteral(resourceName: resourceName)
}
fileprivate func loadPage(_ page: Int) {
guard page < numPages && page != -1 else { return }
if pages[page] == nil {
let newImageView = getRecycledImageView()
newImageView.image = getImage(page: page)
newImageView.contentMode = .scaleAspectFit
newImageView.backgroundColor = UIColor.yellow
var frame = scrollView.frame
frame.origin.x = frame.width * CGFloat(page)
frame.origin.y = -self.topLayoutGuide.length
frame.size.height += self.topLayoutGuide.length
let canvasView = UIView(frame: frame)
scrollView.addSubview(canvasView)
newImageView.translatesAutoresizingMaskIntoConstraints = false
canvasView.addSubview(newImageView)
NSLayoutConstraint.activate([
(newImageView.leadingAnchor.constraint(equalTo: canvasView.leadingAnchor)),
(newImageView.trailingAnchor.constraint(equalTo: canvasView.trailingAnchor)),
(newImageView.topAnchor.constraint(equalTo: canvasView.topAnchor)),
(newImageView.bottomAnchor.constraint(equalTo: canvasView.bottomAnchor))
])
pages[page] = canvasView
// }
}
}
func getRecycledImageView()->UIImageView{
let unusedImageViews = imageViews.filter { (imageView) -> Bool in
return imageView.isDescendant(of: scrollView) == false
}
if let unusedImageView = unusedImageViews.first{
print("reusing imageView")
return unusedImageView
}else{
let imageView = UIImageView()
imageViews.append(imageView)
return imageView
}
}
fileprivate func loadCurrentPages(page: Int) {
guard (page > 0 && page + 1 < numPages) || transitioning else { return }
// Remove all of the images and start over.
removeAnyImages()
pages = [UIView?](repeating: nil, count: numPages)
loadPage(Int(page) - 1)
loadPage(Int(page))
loadPage(Int(page) + 1)
}
fileprivate func gotoPage(page: Int, animated: Bool) {
loadCurrentPages(page: page)
var bounds = scrollView.bounds
bounds.origin.x = bounds.width * CGFloat(page)
bounds.origin.y = 0
scrollView.scrollRectToVisible(bounds, animated: animated)
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let pageWidth = scrollView.frame.width
let page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1
loadCurrentPages(page: Int(page))
}
}
Frame object has no attribute 'box'
Window object has no attribute 'box'
我尝试过:
self.box=ttk.Combobox(self.frame2 , values[...])
self.button1=tk.Button(self.frame2, command= self.wipe(), text=...)
def wipe(self):
self.box.get()
目标是从组合框中简单地获取选定的选项。
这里的代码最少,会产生相同的错误:
def wipe(self):
self.frame2.box.get()
答案 0 :(得分:0)
我会在问题中添加标签“ tkinter”。
尝试以下操作:
def wipe(self):
# code
self.box=ttk.Combobox(self.frame2 , values[...])
self.button1=tk.Button(self.frame2, command=wipe, text=...)
注意以下几点:
command=self.wipe()
,因为这里有两个问题。首先,将command
设置为self.wipe()
的结果,这不是函数。其次,您尚未定义self.wipe
,尚未定义wipe
。command=wipe
将command
关键字参数设置为
函数wipe
我处理tkinter已经很久了,如果这不起作用,我会尝试再次检查文档来寻求帮助。